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

*Storage 연결방식

-DAS(Direct Access Storage)

-NAS(Network Access Storage)

-SAN(Storage Area Network)

 

 

*디스크시스템 고려요소

1. 용량 : 물리용량 <> 사용가능용량

 - RAID Level 1(50%이하) or 5(75%)

 - Hot spare - local

                 - global

  ex) 2400   local 5 + 1 = 6.....   400 개

                global 5%

                       2400 * 5% = 120

                       2280 / 5 = 456 개

 - HDD Type. 용량

 - 디스크 구성

 

 

2. 성능

 - HDD Type - RPM  - (Avg seek time/latency time)

                    IOPS

 - 컨트롤러 : 성능(CPU,RAM) , 갯수

 - 채널 : 갯수, 토폴로지

 - 캐쉬 : 용량

           

 

예제)

VDI : windows 7

최대응답시간 : 3초

IO Size : 8kb

총 데이터 크기 : 3MB     .. 3초로 나누면 초당 1M 전송속도 필요

 

HDD : IOPS - 20 !

8kb x 20 = 160kb        그렇다면 디스크 7개로 묶으면 1MB 달성할 수 있겠군!

 

그러나 실제로는 실패한다.

왜? 벤더가 제공한 IOPS는 MAX값이었다.

 

왠만하면 50%의 수치로만 신뢰하자 (권장은 30~40%)

 

 

3. 기능

 - 스토리지 가상화

 - 씬프로비저닝

 - 중복제거

 - 컨트롤러 부가기능

 

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

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

* Network의 개념 Level 설명

- 사람간의 Network -> 연결, 소통, 관계

- 사람들이 서로 Networking을 한다 -> 상호작용 -> 대화

- OSI 7 Layer <- 개념 Level

 

 

 Web Browser

 

 

 

 HTTP

 

 

 

 -

 

 

 User

SSL(TLS) 

 

 

 Kernel

 TCP

<- Port 번호 (Application)

 

 IP

<- IPv4 주소 (Host)

 WAN

 H/W

 Ethernet

<- MAC 주소 (NIC) 

 LAN

-

 

 

Link, Connection, Session 등 연결이라는 추상개념에 다양한 구현이 있다.

각 계층에서의 주관심사는 모두 다르다.

역할자에 따라서도 TCP Port번호를 Application, Process ,Service, Socket의 식별자로 볼 수도 있다.

 

 

* 망구성

출발지에서 목적지를 찾아가는 행위를 Switch라고 볼 때 그 기준이 되는 값에 따라서 Switch분류를 할 수 있다. (L2, L3등.)

 

 

                                                                     Core는 2중화 ==> core에서 R거쳐서 ISP로

                                                                      [backbone개념]

                                                  라우터 : Gateway

                                  L2(VLAN지원) : Distribution

                      [up link]

        L2 : Access

 1          6

PC    Notebook

 

 

 

* 네트워크를 이용해서 각 Layer에서 목적지로 보내기 위한 작업을 수행한다. 각 Layer는 독립적

 

                    L4            L3          L2

Payload -> Segment -> Packet -> Frame

 

 

Frame은 각 구간에서 갈아타기 위해서 계속 바뀔 수 있으나 Packet은 변하지 않는다.

수신처에서 검사할때 Header만 보는 것은 방화벽, 내용을 보면 IPS 로 볼 수 있겠다.

 

 

 

 

- 수강한지 10년도 넘은 네트워크 이론을 다시 Review해보는 좋은 시간!

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

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

 

* Computer

194x : 직업(인간) -> 기계

  최초의 컴퓨터 : 콜로서스(앨런 튜링)

  최초의 전자식 컴퓨터 : 에니악

                                -> TR PDP-1

     OS : UNIX (1969)

                                  NET : ARPA -> INTERNET : 전길남 박사 참여

 

 벨연구소

커닝헨 B언어로 UNIT 개발시작...  C언어 : 데니스 리치 + 켄 톰슨  로 전면 전환(1971~2)

B언어에 없었으나 C언어에 있었던 포인터 !!!

 

OS는 Hardware를 제어하는 프로그램이고 그 위에서 Application이 수행된다. 종합하면

1. HW

2. System (OS)

3. Application

가 IT Platform을 구성하게 된다.

* Infra Design

각 구성요소를 어떻게 구성시켰을 때 최고의 효과를 볼 수 있을까?

 

* Mark II

Bug 발견 : 최초의 Bug Fix

프로그래밍언어의 창시

신호:문자     번역       논리구성 -> 문자

(Low)      (Compile)          (High)

 

 

* Layered Architecture

 (개별적,독립적) ->

 |

 v  의존성(존립),전제조건

 

 

각 Layer는 독립적이지만 하위Layer에 의존성(존립)->전제조건이 있다.

요소에 대한 관계가 중요하다 !

 

 

 

H/W - OS - Appliction 도 개별적이며 의존적인 구성으로 되어있다.

 

각 구성요소를 단일 혹은 멀티로 구성하는 것에 대해서 다양한 아키텍처가 나오게 된다.

 

HW : (CPU + RAM) + FileSystem + Network

 

 

 

 

 

 

- 학부시절에 수강했던 프로그래밍언어론 부터 Review해보는 시간

 

 

 

 

 

 

           

 

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

Security Platform  (0) 2016.06.28
Storage Platform  (0) 2016.06.28
Network Platform  (0) 2016.06.27

Hadoop분산환경에서 FTP연결관련 공부를 하면서 몇가지 테스트 프로그램을 작성했는데..

갑자기 Connection Reset이라는 오류가 발생한다. 구글링을 하면 대부분 Firewall, Network Setting, IPV4, 좀 더나아가서는 Data Connection에 대한 설명들(Active/Passive)이 있다. 

(Data Connection방식에 대한 상세한 설명은 다른 글에서 포스팅할 예정)

그러나.. 며칠동안 나오는 모든 내용을 살펴봤지만 해당하는 부분이 없었다.



<현상>

- Windows IIS FTP 접속시 Data전송요청이나 Command수행 후 재요청하면 Connection Reset이 발생함


원시적인 방법으로 돌아가서 프로그램상의 값을 하나씩 값을 변경해보다가 마침내 원인을 찾았다.



<원인>

- Hadoop에서 사용하고 있는 FTPFileSystem이라는 클래스를 살펴보면 다음과 같이 코딩되어 있다.

client.setFileTransferMode(FTP.BLOCK_TRANSFER_MODE);
client.setFileType(FTP.BINARY_FILE_TYPE);
client.setBufferSize(DEFAULT_BUFFER_SIZE);


이에 관련하여 FTP에 연관되어있는 많은 RFC문서를 볼 수 있는데, 기초가 되는 것이 RFC959 문서이다. 해당 문서를 읽어보면 Transmission Mode에 크게 3종류가 있으며, Hadoop FTPFileSystem은 Block transer mode를 기본으로 사용하고 있다. (https://tools.ietf.org/html/rfc959)


1. Stream Mode : The data is transmitted as a stream of bytes. There is no restriction on the representation type used; record structures are allowed. (가장 기본적인 방식이다.)


2. Block Mode : The file is transmitted as a series of data blocks preceded by one or more header bytes. The header bytes contain a count field, and descriptor code. The count field indicates the total length of the data block in bytes, thus marking the beginning of the next data block (there are no filler bits).


3. Compressed Mode There are three kinds of information to be sent: regular data, sent in a byte string; compressed data, consisting of replications or filler; and control information, sent in a two-byte escape sequence. If n>0 bytes (up to 127) of regular data are sent, these n bytes are preceded by a byte with the left-most bit set to 0 and the right-most 7 bits containing the number n.

compressed data와 그외 정보들로 전송하는 방법이다.


 문제가 되었던 것은 바로 2번 Block Mode!!

리눅스/유닉스 계열의 FTP서버에서는 별 문제가 없지만 IIS 의 FTP에서는 해당 모드를 제대로 지원하지 않아서 계속 EOF 신호를 기다리다가 timeout에 걸려서 server에 socket이 끊어지고 결국 connection reset이 발생하게 된다.

https://technet.microsoft.com/ko-kr/library/cc771040(v=ws.10).aspx

IIS 기반 FTP의 기본 데이터 전송 모드는 스트림입니다. IIS는 현재 블록 또는 압축 데이터 전송 모드를 지원하지 않습니다.

IIS 8.0버전에서 확인해봐도 여전히 Stream Mode만 지원하고 있음.


 현재까지 google이나 naver를 찾아봐도 FTP프로그램 작성시 connection reset현상의 원인에 대해서 FTP Transfer mode에서 해결책을 찾은 경우는 전무하다.

즉 동일한 오류가 발생하더라도 그 원인은 각각 다를 수 있다.



<해결방안>

- 소스를 수정하여 FTPClient 를 Stream Mode로 사용하면 Windows IIS 상에서도 문제없이 전송이 된다.
- 혹은 Block Mode를 사용하고 싶다면 이를 지원하는 FTP Server로 변경하면 된다.

- 왜 Hadoop의 FTPFileSystem에서는 apache net의 FileType이나 FileTransferMode Default값(STREAM_MODE)이 있음에도 불구하고 BLOCK_MODE로 하드코딩을 했을까?
 아마도 Hadoop은 Linux기반의 대용량 처리를 기본으로 하기 때문에 멀티 파일 전송에 유리한 BLOCK_MODE를 택한 것으로 보인다.



<Lesson & Learned>

- 오픈소스들은 결국 어떤 이론과 개념을 코드로 실체화 한 것이기 때문에 사용하기에 앞서서 이해가 필요하다. 원천에 대한 해당 문서를 꼼꼼히 읽어볼 필요가 있다.

- Connection Reset의 경우 매우 다양한 원인에 의해서 발생되지만 로그메시지는 대부분 Socket Read/Write 부분으로 동일하다. 

 따라서 무조건 Google에서 해당 로그를 검색하는 것보다는 Step별로 상세 테스트 케이스를 작성하여 하나씩 검증해나가는 방식을 추천한다. 

 또한 서버환경에 따라서도 다르게 동작하기 때문에 각 구성요소는 동일하게 한다.

아무리 google에 정보가 많아도 일반적이지 않은 오류에 대해서는 무용지물이다.


Flume으로 입력을 받아서 Elasticsearch에 저장

1. Flume설치 

참고사이트 ( https://flume.apache.org/index.html )

  1. Download
    1. wget http://apache.tt.co.kr/flume/1.6.0/apache-flume-1.6.0-bin.tar.gz
  2. untar
    1. tar -zxvf apache-flume-1.6.0-bin.tar.gz
  3. Source, Sink 유형별 참고
    1. https://flume.apache.org/FlumeUserGuide.html
  4. 진행해본 Example

    1. 간단한 seq발생source로 elasticsearch 적재 (conf/example.conf)

    2. 특정 디렉토리를spooling하고, kafka channel을 사용해서 elasticsearch에 적재하는 잡을 구성해봄! (conf/test.conf)

  5. 환경설정
    1. conf/flume-env.sh : export JAVA_OPTS="-Xms100m -Xmx2000m -Dcom.sun.management.jmxremote"
  6. flume 실행 ex)bin/flume-ng agent -n a1 -c conf -f conf/test.conf


참고 : flume에서 사용해야 하는 3rd party lib은 plugins.d 디렉토리 하나만들어서 넣어주면 custom 별로 정리

  (https://flume.apache.org/FlumeUserGuide.html#installing-third-party-plugins

  • eleasticsearch사용시 관련 external jar 추가해야함!


2. kafka 설치

참고사이트 ( http://kafka.apache.org/ )

  1. Download
    1. wget http://apache.mirror.cdnetworks.com/kafka/0.9.0.1/kafka_2.10-0.9.0.1.tgz
  2. unzip
    1. tar -zxvf kafka_2.10-0.9.0.1.tgz
  3.  기동 및 테스트
    1. bin/zookeeper-server-start.sh config/zookeeper.properties
    2. bin/kafka-server-start.sh config/server.properties


3. elasticsearch 설치

참고사이트 ( https://www.elastic.co/ )

  1. Download
    1. wget  https://www.elastic.co/downloads/past-releases/elasticsearch-1-7-5
  2. unzip
    1. unzip elasticsearch-1.7.5.zip
  3. 편리성을 위한 plugin 설치
    1. head(인덱스 및 데이터조회)
      1. bin/plugin -install mobz/elasticsearch-head
    2. bigdesk(노드 및 클러스터 모니터링)
      1. bin/plugin -install lukas-vlcek/bigdesk
  4. 환경설정
    1. config/elasticsearch.yml
      1. cluster.name: elasticsearch
      2. node.name: host01
  5.  기동 및 테스트
    1. bin/elasticsearch
    2. curl -X GET http://localhost:9200/
  6. plugin을 통한확인

    1. head : http://localhost:9200/_plugin/head/
    2. bigdesk : http://localhost:9200/_plugin/bigdesk/
  7. curl을 이용한 데이터 조회방법
    1. https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html
버전 호환성의 문제로 1.7.5로 진행함. 현재 2.2까지 Release


'BigData' 카테고리의 다른 글

Hadoop Securiy for Multi tenant #2  (0) 2017.01.20
Hadoop Securiy for Multi tenant #1  (0) 2017.01.17
Storm특징 및 Spark와의 차이점  (0) 2014.12.12
CAP 정리  (0) 2014.11.28
NoSQL  (0) 2014.11.28

데이터의 유형

데이터를 수집함에 있어서 크게 두 분류로 나눌 수 있다.

Event기반으로 계속 흘러들어오는 데이터와 기존 시스템에 이미 적재되어 있는 데이터.


데이터의 활용

 흔히 말하는 빅데이터 분석은 실시간 데이터를 처리하는 것이 아니라 HDFS상에 적재되어 있는 데이터를 기반으로 Map/Reduce등의 병렬프로그래밍을 통하는 것이었으며 최근에는 실시간 분석에 대한 요구도 높아져서 이를 위한 오픈소스들도 많이 생겨나고 있다.

 기존에는 적재되어 있는 데이터를 기반으로 분석하는 것과 실시간 Event가 분리되어 왔다면

앞으로는 두 종류의 데이터가 하나로 합쳐져서 기존 데이터를 기반으로 모델을 구축한 뒤에, 실시간 데이터들을 모델에 적용하여 예측,분류,Anormaly Detection 등을 수행하게 된다.

 람다아키텍처에 대해서는 별도로 정리하도록 해야겠다.


데이터의 수집방법

 모델구축을 위해서는 대량의 데이터가 반드시 필요하여 이를 위해 대표적인 수집을 위한 오픈소스 툴로 Flume, Sqoop, Gobblin등이 있다. 현재 본인은 File,RDB의 데이터를 수집하기 위해서는 Gobblin을 사용하고, 그 외의 Event기반 데이터는 Flume을 사용하여 수집하고 있으며 메시지 유실, 분산처리 scale out을 위해서 Kafka를 사용하고 있다. 그리고 이러한 작업들을 스케쥴링하기 위해서 Oozie를 사용하고 있다.

 Hadoop Ecosystem에 따른 거의 보편적인 아키텍처라고 볼 수 있겠지만 실제로 사용해보면 많은 어려움이 있다. Cluster구조를 가져간다는 이야기는 결국 네트워크에 의한 멤버쉽 관리가 되어야 하며, 병렬처리를 위해서는 처리량의 분배가 균일하게 이루어져야 한다는 것이다. 테스트를 통해서 적절한 수치를 찾는 것도 쉽지 않은 일이며, 막상 결과가 나왔을때 설명가능한 이유를 찾지 못하는 경우도 있다;;

 그리고 수많은 오픈소스로 이루어져있기 때문에 개별 설정도 어렵고, 서로 연관관계 있는 오픈소스들의 설정이 꼬여있을때는 오류발생의 주 원인이 되며 관리하기도 매우 어렵다.



이미지 출처 : http://7246-presscdn-0-21.pagely.netdna-cdn.com/wp-content/uploads/2015/02/Apache-Hadoop-Ecosystem.jpg


사례참고 

 해당 내용에 대한 아키텍처 공유사례는 많지만 구체적인 수치와 유형별 장단점에 대한 내용은 찾기가 어렵다.

실제로 같은 구성요소를 사용하더라도 그 모습은 요구사항에 따라서 천차만별로 구현된다.

최근 cloudera에 공유된 좋은 사례가 있어서 살펴보았다. 

(http://blog.cloudera.com/blog/2016/03/building-benchmarking-and-tuning-syslog-ingest-architecture-at-vodafone-uk/)


0. Overview

syslog를 수집함에 있어서 다음과 같은 high-level의 아키텍처가 있다.

Flume, Kafka 모두 event기반으로 단위 건당 수바이트의 자료를 처리하기에 적합한 오픈소스이며 내부구조에 대해서는 공식사이트를 참고하는 것이 가장 좋다.



1. 구성요소

Flume

Source-Channel-Sink의 구조로 이루어져있다. 이미 다양한 유형의 데이터에 대해서 Source, Sink등이 구현되어 있어서 쉽게 가져다 사용할 수 있으며, 필요한 부분은 사용자 구미에 맞게 코딩할 수 있다.

해당 사례에서는 syslog source - memory channel - Kafka sink와 Kafka source - memory channel - HDFS sink 를 동시에 사용하고 있다. (Consolidation - https://flume.apache.org/FlumeUserGuide.html)


Kafka

Kafka는 pub/sub구조의 message queue로 볼 수 있는데, 저장소로 Disk공간을 쓰는 것이 특징이다. 따라서 메시지 유실이 되지 않는 것을 최우선으로 하는 시스템에서 사용한다. (그런데 메시지 유실이 되어도 됩니다 라는 시스템은 한번도 본적이 없다.;)


2. 검토요소

성능향상을 위해서는 다음과 같은 요소들을 검토할 필요가 있다.

  • Number of collection tier agents and nodes
  • Number of Kafka sinks per collector tier agent
  • Number of Kafka brokers
  • Number of Kafka topic partitions
  • Kafka broker interconnect network
  • Number of Kafka sources
  • Number of edge tier nodes and Flume Agents per node
  • Number of HDFS sinks
  • Batch-sizes on all of the sinks and sources

사이트에 자세한 내용들이 나와있으니 그냥 간단히 정리해보았다.


* Kafka

- partition의 수는 클러스터상의 디스크수와 최소한 같아야 한다.

- Kafka는 Broker를 통해서 모든 작업을 처리하기 때문에 Broker의 숫자와 메모리를 충분히 확보해주어야 한다. 

- Flume Sink(Kafka Producers)는 일반적으로 Cluster내의 하나의 Partition에 대해서 작업을 하기 때문에 성능을 확보하기 위해서는 충분히 많은 Sink를 갖는게 좋다. 그래야 Kafka Broker가 병렬처리가 원할해 진다.

Birthday problem과 같은 문제로 한 Partition에 2개이상 Sink가 접근할 가능성이 있다! write가 균등하게 되면 좋다.



- Flume Source(Kafka Consumers) : Producer나 Partition에 수에 명확한 관계는 없다. Consumer의 수가 Partition의 수보다 많을 경우 idle상태가 발생한다. Consumer의 수를 Partition보다 작게 하면 모든 Consumer가 일을 하게 된다. 



4개의 Sink가 하나의 Partition을 남겨두고 일을 해서 idle이 발생하고 Kafka Source가 놀고 있는 상황



* Flume - Kafka

Flume과 Kafka를 연계하여 사용할 수 있는 방식은 크게 두 가지가 있다.

1. Kafka Sink를 통해서 기록하고 Kafka Source를 통해서 읽어가는 경우

2. Flume Channel을 Kafka Channel로 사용하는 경우 (Channel의 type은 이외에도 memory, file 등이 있다.)

해당 사례에서는 Kafka channel의 throughput문제와 balanced configuration이 어려운 점을 주요 문제로 생각해서

Kafka Source , Sink방식을 채택했다고 한다. (memory channel의 유실 가능성을 염두하더라도..)



현재 본인은 2번 방식을 사용하고 있었는데. (일단 사용하기가 편하다. 세팅도 간단하고..) 

사용량이 늘어날 것을 감안하면 1번 방식으로 바꿔야 할듯 하다. 

1번도 그렇게 어렵지는 않다. Kafka Source나 Sink는 이미 있다.


3. 결론

Flume-Kafka를 적절하게 사용하기 위해서는 세팅이 필요하다는 내용을 다음과 같이 정리하고 있다.

  • Enough HDFS sinks to handle the output from the Kafka tier
  • A number of Kafka sources fewer than or equal to the number of partitions
  • Sufficient number of partitions that the sources are not the bottleneck, and also that all disks in the Kafka cluster are utilized
  • Enough Kafka sinks such that we have a good probability of not leaving one or more partitions, and hence sources, idle


향후 해야할 일

 빅데이터에 관련된 구성요소들은 거의 대부분 오픈소스이다. 그리고 많은 사람들이 오픈소스는 공짜이며 가져다 쓰기만 하면 된다고 한다. 그럼 빅데이터는 쉽겠네?? 아무나 다하겠네..

반은 맞고 반은 틀리다. 아무나 가져다가 편하게 쓸 수는 있지만...

 OS에 대한 기본적인 이해, Java기반의 어플리케이션 개발 Maven/Gradle기반의 CTIP환경, 요구사항에 맞는 아키텍처 설계 및 오픈소스 선정/커스터마이징 , 추후 버전변경에 따른 릴리즈 관리, 기존 레가시 시스템과의 연계등등 해야할 일도 많고, 기본적으로 소프트웨어관련 일정수준의 지식이 없이는 불가능하다.

(오픈소스를 한번이라도 열어보신분 들은 아시겠지만 정말 깔끔하다. OOP 5대원칙을 이해못하면 예쁘게 커스터마이징하기도 쉽지 않다. 거기다가 데이터분석, 머신러닝 등은 확률,통계,선형대수학 등등 우리를 괴롭혔던 공대수학이 최대의 적으로 등장한다. ㅋㅋ)


항상 공부해야 한다. 끝!



+ Recent posts