1. visual studio 2017 설치

https://www.visualstudio.com/downloads/

(해당 버전에서는 CL.exe 가 디폴트 포함되어 있지 않기 때문에 C++ 환경을 선택해주어야 함)

(visual studio 설치시 python 과 anaconda는 같이 설치했기 때문에 해당버전을 사용)


2. CUDA 설치

https://developer.nvidia.com/cuda-downloads



3. 설치준비

SET CONDA_SSL_VERIFY=false

conda install 사용시 SSL에러가 발생한다면 verify를 잠시 해제하고 사용한다.



conda install pip six nose numpy scipy

conda install mingw libpython


4. Theano설치 - (conda install theano)

(설치 디렉토리로 이동)


git clone https://github.com/Theano/Theano.git

cd Theano

python setup.py develop

conda list



5. 환경변수 설정

- PATH 정보

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64

- THEANO_FLAGS

값 : floatX=float32,device=gpu,nvcc.fastmath=True,lib.cnmem=0.81



6. Keras 설치 - (pip install keras)

(설치 디렉토리로 이동)


git clone https://github.com/fchollet/keras

cd keras

python setup.py develop

conda list


cd keras/examples

ipython mnist_mlp.py


7. cuDNN

 기설치한 cuda와 호환되는 버전을 다운로드 후 설치된 위치로 디렉토리 copy (bin,include,lib)


참고사이트 

http://bryan7.tistory.com/709

http://jangjy.tistory.com/258


*기타 참고명령

  1. (neuralnets) C:\conda install theano
  2. (neuralnets) C:\conda install mingw libpython
  3. (neuralnets) C:\pip install tensorflow
  4. (neuralnets) C:\pip install keras

Proxy 사용할 경우 .condarc 파일 생성 후
proxy_servers:
    http: http://url:8080
    https: https://url:8080


Oozie 와의 연동

1. Ambari로 Oozie 설치 후 아래와 같이 설정

- custom oozie-site

    oozie.action.jobinfo.enable = true

    oozie.action.launcher.yarn.timeline-service.enabled = false

    oozie.service.ProxyUserService.proxyuser.root.groups = * 

    oozie.service.ProxyUserService.proxyuser.root.hosts = * 

- Advanced oozie-site

oozie.service.AuthorizationService.security.enabled=false



2. oozie관련 xml을 작성하여 지정된 위치에 업로드

(hdfs://node01:8020/user/john/oozie-sample.xml)


<workflow-app xmlns="uri:oozie:workflow:0.5" xmlns:sla="uri:oozie:sla:0.2" name="tenant_test"> <global> <job-tracker>${resourceManager}</job-tracker> <name-node>${nameNode}</name-node> </global> <start to="hdfs8"/> <action name="hdfs8"> <ssh xmlns="uri:oozie:ssh-action:0.1"> <host>root@node01</host> <command>/home/root/apps/bin/run-oozie-sample-mr.sh</command> <args>${wf:user()}</args> <args>/user/${wf:user()}/work</args> </ssh> <ok to="end"/> <error to="fail"/> </action> <kill name="fail"> <message>FAIL</message> </kill> <end name="end"/>

</workflow-app>


3. xml에서 사용할 property 설정

(/home/root/apps/config/example.properties)


# Set the Name Node URI e.g. hdfs://sandbox.hortonworks.com:8020 name.node=hdfs://node01:8020 # Set the Resource Manager URI e.g. sandbox.hortonworks.com:8050 resource.manager=node02:8050 nameNode=${name.node} jobTracker=${resource.manager} oozie.wf.application.path=hdfs://node01:8020/user/john/oozie-sample.xml oozie.use.system.libpath=true


4. oozie 실행

 oozie job -oozie http://node01:11000/oozie -config example.properties -doas john -run


5. 참고

  • user 변경

Oozie client 로 job submit 을 할 때는 user.name 속성이 적용되지 않음(os 계정)
user.name oozie command 옵션 중 -doas <userid> 를 사용

 

  • group 변경

Job submit 시 properties 파일에 oozie.job.acl 설정 추가
예: oozie.job.acl=<groupId>



'BigData' 카테고리의 다른 글

Spark에서 Hive ACID Table 접근시 오류  (0) 2017.10.12
Apache hive - transaction  (0) 2017.09.26
Hadoop Security for Multi tenant #3  (0) 2017.03.24
Hadoop Securiy for Multi tenant #2  (0) 2017.01.20
Hadoop Securiy for Multi tenant #1  (0) 2017.01.17

Livy오픈소스를 활용한 Spark impersonation


Hadoop 설정변경이 필요합니다.

1. Hadoop core-site.xml

a. core-site.xml
<property>
<name>hadoop.proxyuser.centos{계정명}.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.centos{계정명}.groups</name>
<value>*</value>
</property>

b. ambari의 경우 custom core-site로 추가

2. Livy configuration

a. livy.conf
livy.impersonation.enabled = true
livy.server.csrf_protection.enabled=false  
(true로 두고 Post로 실행할 경우, Missing Required Header for CSRF protection에러나면  Headers에 추가 X-Requested-By = ambari )


b. ambari의 경우 Spark > Advanced livy-conf 변경

livy.environment = production

livy.impersonation.enabled = true

livy.server.csrf_protection_enabled = false


3. Rest API - Test

a. POST - http://localhost:8998/sessions

   RequestBody {"kind": "spark", "proxyUser": "john"}


b.POST - http://localhost:8998/sessions/{sessionId}/statements

  RequestBody {"code": "var readMe = sc.textFile(\"/user/john/input-data/sample.csv\"); readMe.take(5);"}

c. GET - htpp://localhost:8998/sessions/{sessionId}/statements



'BigData' 카테고리의 다른 글

Apache hive - transaction  (0) 2017.09.26
Hadoop Security for Multi tenant #4  (0) 2017.04.03
Hadoop Securiy for Multi tenant #2  (0) 2017.01.20
Hadoop Securiy for Multi tenant #1  (0) 2017.01.17
Flume-Kafka-Elasticsearch 테스트  (0) 2016.03.14

<개요>

객체지향 디자인은 일반적으로 서양에서 일반적으로 다루는 철학적 사상을 배경으로 하고 있기 때문에 동양 사고에 익숙한 사람들은 잘 와닿지가 않는 듯 하다.

 

 현장에서 경험하고 여러가지를 공부하여 이해한바를 바탕으로 큰 특징을 잡아서 설계관점에서 접근해보면 좋을 것 같다는 생각에 정리를 해본다.

 

 

<내용>

1. 상호의존

 

- 객체지향 디자인에서 나오는 산출물을 크게 정적, 동적으로 나누어 본다면 정적에서는 Class Diagram, 동적에서는 Seq Diagram으로 볼 수 있는데 이는 결국 각 객체의 의존관계를 표현하기 위함이다.

<그림-1 다이어그램의 분류>

 

 

 

<그림-2 Class Diagram>

 

<그림-3 Seq Diagram>


 

 우리나라 사람들이 이러한 Diagram을 그리기 어려워 하는 것도 결국 사고의 방식이 서양과 다르기 때문이 아닌가 생각해본다. 서양인들은 카테고라이징에 강하고 동양인들은 릴레이션에 강하다고 한다.

(호랑이, 원숭이, 바나나 중에서 관계가 있는 것끼리 묶으라고 하면 서양인들은 같은 동물인 호랑이, 원숭이를 선택하고 동양인들은 원숭이, 바나나를 선택한다고 한다...)

 

 - Class Diagram은 결국 우리가 개발할 때 필요한 객체들을 카테고라이징 한 결과물이고

 - Seq Diagram은 그 객체들이 주고 받는 메시지를 정의한 것이다.

 

 - 특히 Seq Diagram상의 메시지는 기능 (method, function, API등) 의 argument, return 타입을 정의하기 때문에 매우 중요하며 각 객체가 주고받는 내용을 포함하기 때문에 결국 각 객체의 책임을 명확하게 정리하는데 많은 도움이 된다.

 

 <Tip>

 Class Diagram은 분류에 집중하고, Seq Diagram은 메시지와 Life Cycle에 집중하면 좋은 결과물이 나온다.

 

 핵심 : 내가 처리할 수 있는 것은 필요한 정보를 받아서 처리 후 결과를 다른 객체에 알려준다. 내가 모든 것을 처리하지 않는다.

 

 

 

2. Coupling & Cohesion

 

 - 이렇게 각 객체를 도출하여 개발을 할 때 어떤 객체가 특정 객체에서만 참조 된다면?

   이런 경우 우리는 Coupling이 강하다고 한다.

 - 이렇게 만들어진 객체는 다른 객체와 협력하기 어렵다. 즉, 재사용성이 낮다.

 - 여러 곳에서 두루 사용될 수 있도록 객체를 설계해야 하며 이를 Cohesion이 높다고 한다.

 - 수년간 프로그램 개발을 하면서 얻었던 몇가지 Tip을 공유하자면 !

 

  <Tip> - 추후 자세히 설명!

  a. Seq Diagram에서 표현되는 메시지, 즉 메소드의 인자값을 유연하게 가져가야한다.

 

  b. ~ is a~ 의 관계보다 ~ has a ~ 의 관계를 가져가도록 노력해야 한다.

 

  c. Class를 설계할 때에도 ConcreateClass보다 Interface와 Abstract를 적극 활용한다.


 

 

3. God Object 를 피하라

 - 1,2번과 연관이 있는 내용이다.

 - 즉 혼자서 모든 것을 처리하는 객체를 만드는 것을 피해야한다.

 - 특히 개발기간이 짧고 소수의 개발자가 투입될 때 많이 나타나는 모양인데 프로젝트 종료 후 반드시 리팩토링을 거쳐야만 한다!!

 - Design Pattern에서 언급되는 대표적인 Anti-Pattern으로 유지보수성이 매우 낮고

  (만든 사람만 고칠 수 있다;; 그래서 개발자로 오래 살아남는법 이라는 책에서는 이렇게 만들라고 권장한다!)

 - 모든 일을 혼자서 다 처리한다는 이야기는 결국 모든 요구사항과 연결되어 있다는 내용이고 매번 고쳐야하는 객체라는 이야기이다. 즉, 재사용성이 낮다.

 

 

<결론>

 - System이라는 말이 한자로 바꾸 가 된다.

 - 우리가 살고 있는 생태계도 여러종류의 생물, 무생물이 각각의 역할을 수행하고 다른 객체와 소통하여 유지가 되고 있는 것처럼

 - IT System도 여러가지 역할이 적절히 분배된 객체들이 잘 어울려야 안정적인 System을 구현할 수 있다.

 - 다양한 다른 객체와 원활하게 소통할 수 있도록 만들어진 객체는 오래 살아남을 수 있지만, 그렇지 않게 설계된 객체는 System상에서 오래 살아남기가 어렵다 (재사용성 측면)

 - 객체지향에 익숙하지 않거나 싫어하는 개발자는 Operation(method, function) 의 Argument나 Return Type을 신경쓰지 않는 경향이 있다. 협업을 위해서 조금만 더 신경써주세요!

 - 전역변수를 주로 사용하고 argument는 비어있고, return 은 void 가 일반적이다;;

   객체지향에서 항상 나오는 캡슐화 와도 연관이 있는데 정말 안 좋은 습관입니다.

 

 

<참조사이트>

https://en.wikipedia.org/wiki/Class_diagram

<현상>

- REST API를 설계하던 중 form data가 POST방식에서는 정상 동작하지만 PUT에서는 동작하지 않는 현상을 발견


<내용>

- POST의 경우 idempotent  하지 않으며, 리소스의 위치를 지정하지 않을 경우 리소스를 새로 생성한다.

- PUT의 경우 idempotent  하며,  리소스의 위치를 명확히 지정하여 생성/수정을 위해서 사용한다.

- PATCH의 경우 idempotent 하며, 리소스의 위치를 명확히 지정하여 일부 속성을 수정하기 위해서 사용한다.   


<확인>

- 현재 Servlet Spec에서 HTTP POST를 위해서는 form data를 사용하지만, HTTP PUT or PATCH에 대해서는 사용이 불가능하다.

 아마도 수정기능을 위해서 support할 필요가 없다고 느껴서 일지도 모르겠지만 개발을 하다보면 불편한 점을 느끼게 된다.


<해결>

- Spring에서 다음과 같은 Class를 제공한다. 

Class HttpPutFormContentFilter


이 필터는 'application/x-www-form-urlencoded' type의 HTTP PUT & PATCH request를 받아서 HTTP POST Request와 같은 형태로 이용할 수 있도록 form data를 만든다.




참고사이트

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6

http://docs.spring.io/spring/docs/current/javadoc-pi/org/springframework/web/filter/HttpPutFormContentFilter.html

https://1ambda.github.io/javascripts/rest-api-put-vs-post/


'Rest API' 카테고리의 다른 글

Spring Boot Application사용중 404 Not Found 발생  (0) 2019.09.02

<개요>

동시에 다수의 Java Process를 기동하여 JDBC Connection을 맺을때 시간이 매우 많이 소요되는 경우가 있습니다.

(timeout이 발생하기도 함)

 

이럴때는 난수발생을 체크해보시기 바랍니다.

 

<내용>

JDBC Driver에서 로그인을 하기 위해서 난수발생을 이용하는데 기본적으로

random을 사용하게 되어있습니다.

 

random에서 waiting이 발생하면서 connection을 맺지 못하는 경우가 있습니다.

이 부분을 urandom을 사용하도록 변경해보시기 바랍니다.

(random에 비해서 urandom은 속도가 빠르고 대신 보안에 취약하다고 보고가 되어있습니다.)

 

 

<방법>

JVM옵션을 아래와 같이 추가합니다.

 

-Djava.security.egd=file:///dev/urandom

 

 

 ps>리눅스 커널버전에 따라서 발생하는 경우도 있으니 같이 확인하시면 좋을 것 같습니다.

+ Recent posts