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

Spark Summit 2017 Boston에 다녀왔습니다.^^ 간단히 느낀점만 공유드리면,

1. Spark Ecosystem이 이제 곧 Hadoop Ecosystem을 능가할 것으로 예상합니다. 기존 분산처리시스템이 Store를 담당하는 부분은 거대하지만 정작 Execute에 대한 부분은 취약한 것을 몸은 크고 뇌는 작은 공룡에 비유하고 있습니다. 이와 반대로 뇌를 담당하는 execute영역에서는 Spark가 선두주자이며 storage는 필요에 따라 선택가능하고 HDFS외의 사례가 많음을 보이고 있습니다.

2. 특히 Spark는 기존의 약점이었던 실시간처리영역을 보완하기 위해서 많은 부분을 준비하고 있으며 Structered Streaming을 키워드로 내세우고 2.2  2.3릴리즈 준비에 박차를 가하고 있습니다. High Level API를 통해서 기존과 동일한 방식으로 코딩환경을 제공할 것으로 예상되며 Apache Beam과 유사성이 보이는데 더 지켜봐야할 것 같습니다.

3. 2010년이후 현재까지 Cpu의발전속도는 거의 없으나 Network,storage는 10배의성장을 보여주는 부분에 주목하여 이를 분산병렬처리의 핵심요소로 보고 여러가지 프로젝트가 진행되고 있었습니다. (ex, carnobdata tungsten parquet등)

전체적으로 방향성은 Store와 Execute를 분리하고 각자요건에 맞게 다양한 요소를 조합하여 사용하는 것이 대세입니다. 특히 streaming에서는 kafka를 안쓰는 곳이 없는 것 같습니다. 또한 분석영역에서 language의 점유율이 scala는 감소한반면 python은 2배가까이 증가하였습니다.

마지막으로 databricks를 포함한 많은 업체가 이러한 기능들을 클라우드상에서 서비스로 제공하기 위해서 노력하고 있습니다.

상세한 내용들은 시간을 내어 정리하고 공부해야 할 것 같습니다^^

'컨퍼런스' 카테고리의 다른 글

Azure Everywhere 2019 후기  (0) 2019.01.12
Red Hat Forum 2018 Seoul 후기  (0) 2018.11.07

Hive, MR Job의 Group별 YARN Queue 사용


0. YARN Queue

LDAP User Group별 Queue 생성


Queue Mappings : g:abiz:abiz,g:adev:adev

설정이 적용되도록  restart

1. Hive 

설치

ambari 활용

Hive 실행 및 데이터 생성

sudo su - hive
[hive@node01 ~]$ hive
hive> create table table1(a int, b int);
hive> insert into table1 values( 1,2);
hive> insert into table1 values( 1,3);
hive> insert into table1 values( 2,4);

 

LDAP 계정으로 Hive 실행


[hive@node01 ~]$ beeline
Beeline version 1.2.1000.2.5.3.0-37 by Apache Hive
beeline> !connect jdbc:hive2://node02:10000/default john
Enter password for jdbc:hive2://node02:10000/default: **** (hive)
Connected to: Apache Hive (version 1.2.1000.2.5.3.0-37)
Driver: Hive JDBC (version 1.2.1000.2.5.3.0-37)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://node02:10000/default> select sum(a) from table;
INFO : Tez session hasn't been created yet. Opening session
INFO : Dag name: select sum(a) from table(Stage-1)
INFO :
INFO : Status: Running (Executing on YARN cluster with App id application_1484727707431_0001)
INFO : Map 1: -/- Reducer 2: 0/1
INFO : Map 1: 0/1 Reducer 2: 0/1
INFO : Map 1: 0/1 Reducer 2: 0/1
INFO : Map 1: 0(+1)/1 Reducer 2: 0/1
INFO : Map 1: 0/1 Reducer 2: 0/1
INFO : Map 1: 1/1 Reducer 2: 0(+1)/1
INFO : Map 1: 1/1 Reducer 2: 1/1
+------+--+
| _c0 |
+------+--+
| 4 |
+------+--+
1 row selected (23.803 seconds)



2. MR Job (OS계정)

WordCount 실행

hadoop home (/usr/hdp/2.5.3.0-37/hadoop)에 Word Count Example 다운로드 후 압축풀기

[root@node01 hadoop]# unzip Hadoop-WordCount.zip
Archive:  Hadoop-WordCount.zip
   creating: Hadoop-WordCount/
   creating: Hadoop-WordCount/classes/
   creating: Hadoop-WordCount/input/
  inflating: Hadoop-WordCount/input/Word_Count_input.txt 
  inflating: Hadoop-WordCount/WordCount.java 
  inflating: Hadoop-WordCount/clean.sh 
  inflating: Hadoop-WordCount/build.sh 
  inflating: Hadoop-WordCount/classes/WordCount$Reduce.class 
  inflating: Hadoop-WordCount/classes/WordCount.class 
  inflating: Hadoop-WordCount/classes/WordCount$Map.class 
  inflating: Hadoop-WordCount/wordcount.jar

 

adev의 jane으로 실행

[root@node01 Hadoop-WordCount]# su - hdfs
[hdfs@node01 Hadoop-WordCount]$ hadoop fs -mkdir /user/jane
[hdfs@node01 Hadoop-WordCount]$ hadoop fs -chown jane:adev /user/jane
[hdfs@node01 Hadoop-WordCount]$ exit
[root@node01 Hadoop-WordCount]# su jane
[jane@node01 Hadoop-WordCount]$ hadoop fs -put input/ /user/jane/input

 

Word Count jar 실행

[jane@node01 Hadoop-WordCount]$ hadoop jar /usr/hdp/2.5.3.0-37/hadoop/Hadoop-WordCount/wordcount.jar WordCount input output
17/01/19 02:28:04 INFO impl.TimelineClientImpl: Timeline service address: http://node02:8188/ws/v1/timeline/
17/01/19 02:28:04 INFO client.RMProxy: Connecting to ResourceManager at node02/172.31.1.255:8050
17/01/19 02:28:04 INFO client.AHSProxy: Connecting to Application History server at node02/172.31.1.255:10200
17/01/19 02:28:05 INFO input.FileInputFormat: Total input paths to process : 1
17/01/19 02:28:05 INFO mapreduce.JobSubmitter: number of splits:1
17/01/19 02:28:05 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1484790795688_0002
17/01/19 02:28:05 INFO impl.YarnClientImpl: Submitted application application_1484790795688_0002
17/01/19 02:28:05 INFO mapreduce.Job: The url to track the job: http://node02:8088/proxy/application_1484790795688_0002/
17/01/19 02:28:05 INFO mapreduce.Job: Running job: job_1484790795688_0002
17/01/19 02:28:16 INFO mapreduce.Job: Job job_1484790795688_0002 running in uber mode : false
17/01/19 02:28:16 INFO mapreduce.Job:  map 0% reduce 0%
17/01/19 02:28:29 INFO mapreduce.Job:  map 100% reduce 0%
17/01/19 02:28:35 INFO mapreduce.Job:  map 100% reduce 100%
17/01/19 02:28:36 INFO mapreduce.Job: Job job_1484790795688_0002 completed successfully
17/01/19 02:28:36 INFO mapreduce.Job: Counters: 49
    File System Counters
        FILE: Number of bytes read=167524
        FILE: Number of bytes written=616439
        FILE: Number of read operations=0
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
        HDFS: Number of bytes read=384328
        HDFS: Number of bytes written=120766
        HDFS: Number of read operations=6
        HDFS: Number of large read operations=0
        HDFS: Number of write operations=2
    Job Counters
        Launched map tasks=1
        Launched reduce tasks=1
        Data-local map tasks=1
        Total time spent by all maps in occupied slots (ms)=10159
        Total time spent by all reduces in occupied slots (ms)=8196
        Total time spent by all map tasks (ms)=10159
        Total time spent by all reduce tasks (ms)=4098
        Total vcore-milliseconds taken by all map tasks=10159
        Total vcore-milliseconds taken by all reduce tasks=4098
        Total megabyte-milliseconds taken by all map tasks=10402816
        Total megabyte-milliseconds taken by all reduce tasks=8392704
    Map-Reduce Framework
        Map input records=9488
        Map output records=67825
        Map output bytes=643386
        Map output materialized bytes=167524
        Input split bytes=121
        Combine input records=67825
        Combine output records=11900
        Reduce input groups=11900
        Reduce shuffle bytes=167524
        Reduce input records=11900
        Reduce output records=11900
        Spilled Records=23800
        Shuffled Maps =1
        Failed Shuffles=0
        Merged Map outputs=1
        GC time elapsed (ms)=144
        CPU time spent (ms)=2950
        Physical memory (bytes) snapshot=1022894080
        Virtual memory (bytes) snapshot=6457335808
        Total committed heap usage (bytes)=858783744
    Shuffle Errors
        BAD_ID=0
        CONNECTION=0
        IO_ERROR=0
        WRONG_LENGTH=0
        WRONG_MAP=0
        WRONG_REDUCE=0
    File Input Format Counters
        Bytes Read=384207
    File Output Format Counters
        Bytes Written=120766

 

WordCount 결과

[jane@node01 Hadoop-WordCount]$ hadoop fs -ls /user/jane/
Found 3 items
drwx------   - jane adev          0 2017-01-19 02:28 /user/jane/.staging
drwxr-xr-x   - jane adev          0 2017-01-19 02:17 /user/jane/input
drwxr-xr-x   - jane adev          0 2017-01-19 02:28 /user/jane/output

 


3. MR Job (HADOOP_USER_NAME parameter)

WordCount 실행 

HDFS에 user를 위한 폴더를 생성 후 input을 업로드


 

Word Count jar 실행 (HADOOP_USER_NAME=lucy)


[root@node01 Hadoop-WordCount]# HADOOP_USER_NAME=lucy hadoop jar /usr/hdp/2.5.3.0-37/hadoop/Hadoop-WordCount/wordcount.jar WordCount input output
17/01/19 04:58:54 INFO impl.TimelineClientImpl: Timeline service address: http://node02:8188/ws/v1/timeline/
17/01/19 04:58:54 INFO client.RMProxy: Connecting to ResourceManager at node02/172.31.1.255:8050
17/01/19 04:58:54 INFO client.AHSProxy: Connecting to Application History server at node02/172.31.1.255:10200
17/01/19 04:58:55 INFO input.FileInputFormat: Total input paths to process : 1
17/01/19 04:58:55 INFO mapreduce.JobSubmitter: number of splits:1
17/01/19 04:58:56 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1484800564385_0001
17/01/19 04:58:56 INFO impl.YarnClientImpl: Submitted application application_1484800564385_0001
17/01/19 04:58:56 INFO mapreduce.Job: The url to track the job: http://node02:8088/proxy/application_1484800564385_0001/
17/01/19 04:58:56 INFO mapreduce.Job: Running job: job_1484800564385_0001
17/01/19 04:59:05 INFO mapreduce.Job: Job job_1484800564385_0001 running in uber mode : false
17/01/19 04:59:05 INFO mapreduce.Job:  map 0% reduce 0%
17/01/19 04:59:12 INFO mapreduce.Job:  map 100% reduce 0%
17/01/19 04:59:19 INFO mapreduce.Job:  map 100% reduce 100%
17/01/19 04:59:19 INFO mapreduce.Job: Job job_1484800564385_0001 completed successfully
17/01/19 04:59:19 INFO mapreduce.Job: Counters: 49
    File System Counters
        FILE: Number of bytes read=167524
        FILE: Number of bytes written=616439
        FILE: Number of read operations=0
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
        HDFS: Number of bytes read=384328
        HDFS: Number of bytes written=120766
        HDFS: Number of read operations=6
        HDFS: Number of large read operations=0
        HDFS: Number of write operations=2
    Job Counters
        Launched map tasks=1
        Launched reduce tasks=1
        Data-local map tasks=1
        Total time spent by all maps in occupied slots (ms)=5114
        Total time spent by all reduces in occupied slots (ms)=7530
        Total time spent by all map tasks (ms)=5114
        Total time spent by all reduce tasks (ms)=3765
        Total vcore-milliseconds taken by all map tasks=5114
        Total vcore-milliseconds taken by all reduce tasks=3765
        Total megabyte-milliseconds taken by all map tasks=5236736
        Total megabyte-milliseconds taken by all reduce tasks=7710720
    Map-Reduce Framework
        Map input records=9488
        Map output records=67825
        Map output bytes=643386
        Map output materialized bytes=167524
        Input split bytes=121
        Combine input records=67825
        Combine output records=11900
        Reduce input groups=11900
        Reduce shuffle bytes=167524
        Reduce input records=11900
        Reduce output records=11900
        Spilled Records=23800
        Shuffled Maps =1
        Failed Shuffles=0
        Merged Map outputs=1
        GC time elapsed (ms)=148
        CPU time spent (ms)=3220
        Physical memory (bytes) snapshot=1033814016
        Virtual memory (bytes) snapshot=6464356352
        Total committed heap usage (bytes)=833617920
    Shuffle Errors
        BAD_ID=0
        CONNECTION=0
        IO_ERROR=0
        WRONG_LENGTH=0
        WRONG_MAP=0
        WRONG_REDUCE=0
    File Input Format Counters
        Bytes Read=384207
    File Output Format Counters
        Bytes Written=120766

 

WordCount 결과

[lucy@node01 Hadoop-WordCount]$ hadoop fs -ls /user/lucy
Found 3 items
drwx------   - lucy adev          0 2017-01-19 04:59 /user/lucy/.staging
drwxr-xr-x   - lucy adev          0 2017-01-19 04:48 /user/lucy/input
drwxr-xr-x   - lucy adev          0 2017-01-19 04:59 /user/lucy/output



'BigData' 카테고리의 다른 글

Hadoop Security for Multi tenant #4  (0) 2017.04.03
Hadoop Security for Multi tenant #3  (0) 2017.03.24
Hadoop Securiy for Multi tenant #1  (0) 2017.01.17
Flume-Kafka-Elasticsearch 테스트  (0) 2016.03.14
Storm특징 및 Spark와의 차이점  (0) 2014.12.12

Hadoop 은 기본적으로 하나의 계정을 이용해서 작업하는 것이 매우 편한 구조이지만, 저장공간 및 병렬처리 Application을 Platform의 형태로 다양한 사용자에게 서비스를 제공하기 위해서는 반드시 Multi tenant가 지원되어야 하며 이를 위해서 스터디를 진행했던 내용으로 정리합니다.



Hadoop은 별도의 group정보를 가지고 있지 않습니다. 따라서 GroupMapping을 위해서 다음과 같은 방법들이 권장되고 있는데 이 중에서 추천되고 있는 LDAP - SSSD 연계방안을 테스트해보았습니다.

http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html#Group_Mapping


https://docs.hortonworks.com/HDPDocuments/Ambari-2.2.2.18/bk_ambari-security/content/setting_up_hadoop_group_mappping_for_ldap_ad.html



1. OpenLDAP

사용자가 늘어날 때 마다 매번 OS에 사용자를 만드는 작업은 부담이 될 수 있으며 portal, OS, HDFS등 여러 곳에 사용자 정보가 있을경우 관리Point가 늘어나기 때문에 LDAP으로 저장소를 통일합니다.



- 기본환경 설정

yum update;

yum upgrade;

/etc/init.d/iptables save;

/etc/init.d/iptables stop;

chkconfig iptables off;

yum install -y ntp;

chkconfig --level 3 ntpd on;

service ntpd start;

yum update –y openssl


- OpenLDAP설치

yum install openldap-servers

yum install openldap-clients



- OpenLDAP설정 및 실행

service slapd start 



- 환경변수 설정 OpenLDAP설정

LDAP 설정 참조 


- 사용자/그룹 추가

LDAP 설정 참조 



- Config 및 Entry 조회

ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config 

ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
ldapsearch -x -D "cn=Manager,dc=company,dc=com " -w admin123 -b dc=company,dc=com


* OS와 연동을 위해서 posixGroup 생성을 추천



2. SSSD 설치 및 LDAP 연동

- 참고사이트


- NSS 설정 (/etc/nsswitch.conf)

passwd:     files sss

group:      files sss


- SSSD 설치 및 설정(/etc/sssd/sssd.conf)

 yum install sssd


[sssd]

services = nss, pam
sbus_timeout = 30
domains = LDAP
 
[nss]
filter_users = root
filter_groups = root
 
[domain/LDAP]
enumerate = true
cache_credentials = TRUE
 
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
 
ldap_uri = ldap://
ldap_user_search_base = dc=company,dc=com
tls_reqcert = demand
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt


service sssd start




3. 실제 HDFS 환경 테스트

- UGI 생성 테스트 코드

 public class UGI {

        public static void main(String[] args){
                try {
                        String username = "john";
                        UserGroupInformation ugi
                                        = UserGroupInformation.createRemoteUser(username);
                        ugi.doAs(new PrivilegedExceptionAction<Void>() {
                                public Void run() throws Exception {
                                        Configuration conf = new Configuration();
                                        conf.set("fs.defaultFS""hdfs://host01:8020");
                                        conf.set("hadoop.job.ugi", username);
                                        FileSystem fs = FileSystem.get(conf);
                                        fs.createNewFile(new Path("/user/john/test"));
                                        FileStatus[] status = fs.listStatus(new Path("/user/john"));
                                        for(int i=0;i<status.length;i++){
                                                System.out.println(status[i].getPath());
                                        }
                                        return null;
                                }
                        });
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}


- UGI 조회 테스트 코드

 public class UGIRead {

        public static void main(String[] args){
                try {
                        String username = "john";
                        UserGroupInformation ugi
                                        = UserGroupInformation.createRemoteUser(username);
                        ugi.doAs(new PrivilegedExceptionAction<Void>() {
                                public Void run() throws Exception {
                                        Configuration conf = new Configuration();
                                        conf.set("fs.defaultFS""hdfs://host01:8020");
                                        conf.set("hadoop.job.ugi", username);
                                        FileSystem fs = FileSystem.get(conf);
                                        InputStream stream = fs.open(new Path("/user/john/test"));
                    BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
                    System.out.println(reader.readLine());
                                        reader.close();
                    stream.close();
                    fs.close();
                                        return null;
                                }
                        });
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}

 

- hadoop fs 명령어 테스트

hadoop fs -ls /user/john

hadoop fs -cat /user/john/test


4. 기타 참고사항
LDAP에 있는 사용자들이 실제 OS는 존재하지 않기 때문에 home 디렉토리가 없는 상태이기 때문에 자동으로 생성해줄수 있도록 패키지 설치 및 환경설정이 필요합니다.

yum install oddjob-mkhomedir oddjob

chkconfig oddjobd on
service oddjobd start
authconfig --enablemkhomedir --update



5. 결과내용
- 프로세스를 기동한 OS계정이 아닌 LDAP에 등록되어 있는 계정으로 HDFS 사용이 가능합니다.
 (Java API 및 hadoop fs 명령어 모두 사용가능)
- Hadoop의 namenode가 판단하기 때문에 sssd는 namenode에 설치되어야 합니다.
- 실제 작업이 수행될 때 YARN Queue에 사용자/그룹별로 queue name을 지정해서 수행해야 할텐데 이부분은 추가 테스트가 필요합니다.
- 사용자 인증에 대한 부분이나 기타 보안사항에 대해서는 추가 보완이 필요합니다.
- 단일 Hadoop Cluster에 대한 multi tenant내용이기 때문에 서로 다른 Hadoop Cluster 연계에 대한 부분은 아닙니다.


참고)

A. createRemoteUser

1. OS에 없는 계정으로 시도 : 오류발생

2. OS에 있는 계정으로 하면 성공  : createRemoteUser API의 인자를 user 로 인식함

 

B. ugi.doAs

- createRemoteUser와 Configuration의 hadoop.job.ugi 가 다를 경우 : 별도 오류는 발생하지 않음

 

- FileSystem.createNewFile 시도시 권한없으면 오류 발생 

 ex) jane 계정으로  /user/hdfs/test22파일생성 시도

  Permission denied: user=jane, access=EXECUTE, inode="/user/hdfs/test22":hdfs:hdfs:drwx------

 

- FileSystem.listStatus 시도시 권한 없으면 오류 발생

 ex) jane 계정으로 /user/hdfs 조회시도

  Permission denied: user=jane, access=READ_EXECUTE, inode="/user/hdfs":hdfs:hdfs:drwx------

 

- 적합한 계정으로 작업할 경우 모두 성공


'BigData' 카테고리의 다른 글

Hadoop Security for Multi tenant #3  (0) 2017.03.24
Hadoop Securiy for Multi tenant #2  (0) 2017.01.20
Flume-Kafka-Elasticsearch 테스트  (0) 2016.03.14
Storm특징 및 Spark와의 차이점  (0) 2014.12.12
CAP 정리  (0) 2014.11.28

1. Server Security

 - OS 보안기능

     자원권한 관리

     사용자 관리

     보안점검 및 로딩

     특별 권한 할당

 - OS 보안툴(분야별)

 - SSO

     Single Logon으로 모든 시스템 사용

 - EAM/IAM

     SSO와 연계하여 권한/인증 통합관리

 - LDAP

    

2. Network Security

 - ACL : 네트워크 Port 접근 제어

 - NAC : 네트워크 접근제어를 위한 인증

 - VPN : 분리된 네트워크망 연결

 - Firewall : 특정 대역 보호

 - IDS/IPS : 침입 탐지/방지

 - 발신통제 : 외부통신 통제

 

3. Application Security

 - Web Server 보안 : HTTPS/SSL, PKI, 웹 방화벽

 - WAS Server 보안 : 접근 통제 및 암호화, 노드인증

 

 

PKI, 공개키/개인키등등 상세한 내용은 추후 정리한다.

'Infra Architecture' 카테고리의 다른 글

Storage Platform  (0) 2016.06.28
Network Platform  (0) 2016.06.27
IT Platform History & 구성요소  (0) 2016.06.27

+ Recent posts