Impala Connection refuse Error

-          Couldn't open transport for hd-master:26000 (connect() failed: Connection refused)

 

·       Version : CDH 6.3

 

파이썬의 pyimpala 사용하여 Hadoop Impala 데이터를 입력하는 클라이언트가 있는데, 어느날부터 아래와 같은 오류를 출력하며 데이터가 입력되지 않았다.

InternalException: Error requesting prioritized load: Couldn't open transport for hd-master:26000 (connect() failed: Connection refused)

Error making an RPC call to Catalog server.

 

위와 같은 오류 메시지가 발생하였을경우,  impala 환경설정에서 Java Heap Size of Catalog Server in Bytes사이즈를 넉넉하게 할당함으로써 문제를 해결할 있다.

Java Heap Size of Catalog Server in Bytes

 

 

2020-06-11 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, 임팔라, Impala, Connection refuse, 임팔라 커넥션 오류

Hive 데이터 타입

 

·       Version : Hive

 

Hive 여러 크기의 정수형과 부동소수점, 불린형과 임의의 길이를 가지는 문자열, TIMESTAMP, BINARY 타입등을 제공한다. 각각의 데이터형은 자바로 구현되어 있어 자바 데이터 타입과 동일하게 하이브에서 사용된다.

타입

크기

리터럴 문법 예제

TINYINT

1바이트 정수형

20

SMALLINT

2바이트 정수형

20

INT

4바이트 정수형

20

BGINT

8바이트 정수형

20

BOOLEAN

TRUE 또는 FALSE

TRUE

FLOAT

단정도 부동 소수점

3.14159

DOUBLE

배정도 부동 소수점

3.14159

STRING

문자의 시퀀스, 또는 문자열  설정가능. 작은 따옴표 큰따옴표 사용가능

‘Hello Hive’, “Hello Hive”

TIMESTAMP

정수형, 부동소수점, 문자열형

유닉스 TIMESTAMP, JDBC 호환 java SQL Timestamp 포맷. 소수점 9자리(nano second) 까지 가능

BINARY

바이트 배열의 형태 지원

 

 

BYNARY 데이터형은 관계형 데이터베이스의 VARBINARY 비슷하지만 관계형 데이터베이스는 BLOB 데이터 형은 별도의 저장소에 보관하는반면에, 하이브는 BINARY 데이터형의 데이터를 레코드에 모두 저장한다.

 

하이브는 다른 SQL 호환 언어처럼, 데이터형 이름의 대소문자 구분을 무시한다. 하지만 SQL 에서 일반적으로 지원하는 최대 허용 길이를 갖는 문자배열 지원하지 않는다. 관계형 데이터베이스와 목적이 다를뿐더러 다양한 파일 포맷을 지원해야 하기 때문에 필드를 구분할 있는 구분기호에 의존한다. 또한 하둡 하이브는 디스크의 읽기, 쓰기 성능 최적화를 강조하기 때문에 컬럼값이 길이를 고정하는것은 상대적으로 중요하지 않다.

 

하이브에서 단점도 부동소수점(FLOAT) 배정도 부동소수점(DOUBLE) 컬럼을 비교하거나, 정수형 값을 비교하는 쿼리를 실행하면, 묵시적으로 개의 데이터 타입중에 크기의 데이터  타입으로 변환하여, 동일한 데이터 타입으로 만든 비교한다. 문자열의 값을 숫자로 해석하려는 경우 명시적으로 다른 데이터형으로 변환하여 사용할 있다.

 

하이브는 struct, map, array 같은 컬럼을 지원한다. 또한 컬렉션 데이터 타입의 이름 대소문자 구분을 무시한다.

타입

설명

리터럴 문법 예제

STRUCT

C 구조체나 객체와 유사. 필드는 표기법으로 사용

struct(‘Sungwook’, ‘Kang’)

MAP

Key-Value 처럼 필드를 배열 표기법으로 사용

map(‘first’,’Sungwook’,’last’,’Kang’)

ARRAY

0으로 시작하는 정수로 색인할 있는 동일한 데이터형의 순차 시퀀스

array(‘Sungwook’, ’Kang’)

 

하이브는 개념을 가지고 있지 않다. 하지만 색인 테이블은 사용이 가능하다. 컬렉션 데이터 타입은 자바의 제네릭(generics) 문법 규칙을 따를 것에 유의해야한다. 예를들어 MAP<STRING, FLOAT> 모든 키는 STRING 데이터 타입을 가지고, 모든 값은 FLOAT 이다. ARRRAY <STRING> 마찬가지로 모든 아이템은 STRING 데이터 타입을 가진다. STRUCT 서로 다른 데이터 타입을 섞어 사용할 있으나 STRUCT 안에서 선언된 위치는 고정된다.

 

 

 

[참고자료]

·       Hive Data Types : https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

 

 

2020-06-08 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, Hive, 하이브, 하이브 데이터 타입

HDFS 데이터 저장소에는 RAID구성이 필요할까

 

·       Version : HDFS

 

HDFS 클러스터에서 데이터노드 저장소 용도로 RAID(Redundant Array of Independent Disks) 사용하면 이득이 있을까?

결론부터 이야기하면 이득이 없다. HDFS 노드간에 복제하는 기능이 있어 RAID 제공하는 중복성(redundancy) 필요하지 않기 때문이다. 또한 성능 향상을 위해 흔히 사용하는 RAID 0 (Striping) 모든 디스크에 DHFS 블록을 연속적으로 배열하는 HDFS JBOD (Just a Bunch of Disks)방식보다 느리다는 것이 밝혀졌다. 이유는 RAID 0 읽기/쓰기 동작의 경우 RAID 배열에서 가장 느린 디스크의 속도에 의해 제한을 받기 때문이다. 반면 JBOD에서는 디스크 동작들이 독립적이며 이러한 동작들의 평균속도는 가장 느린 디스크보다 빠르다. 실제로 동일한 제조사의 동일 모델의 디스크여도 편차를 보이는 경우가 있다. 또한 JBOD 환경에서는 디스크 하나가 고장날 HDFS 고장난 디스크 없이도 계속해서 동작할 있지만  RAID 하나의 디스크 고장이 전체 디스크 배열을 불능 상태로 만들 있다. 뜻한 RAID 0에서 디스크 한개의 불량이 노드 하나를 통째로 불능 상태로 만들 있다는 뜻이다.

 

그렇다면  HDFS에서 RAID 정말 필요 없을까?  네임노드에는 RAID 1 (Mirroring)으로 구성하여 가용성을 높일 있다.

 

디스크 목록을 dfs.data.dir 매개변수에 전달하면 하둡은 사용 가능한 모든 디스크를 사용한다. 디스크가 오프라인 상태가 되면 사용가능 대상에서 제외한다. 그리고 제외된 디스크가 다시 사용가능한 상태가 되었는지 검사하지는 않는다.

 

Note : 하둡 시스템에 사용하는 메모리는 ECC 메모리를 사용하도록 한다. ECC 메모리가 아닌 경우 하듭 클러스터에서 체크섬 오류가 발생할 있다.

 

 

[참고자료]

 

 

2020-06-07 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, 하둡 RAID, 분산 처리, 분산 저장

'SW Engineering > Hadoop' 카테고리의 다른 글

Impala Connection refuse Error  (0) 2020.06.12
Hive 데이터 타입  (0) 2020.06.09
Hive에서 하둡(dfs)명령 실행  (0) 2020.05.19
ZooKeeper 옵저버와 CLI  (0) 2020.05.19
Hive에서 쉘 명령 실행  (0) 2020.05.18

Hive에서 하둡(dfs)명령 실행

 

·       Version : Hive

 

하이브(Hive)에서 하둡(dfs) 명령을 수행할 있다. 하이브에서 하둡 명령어를 사용하는 방법은 dfs 사용하고 마지막에 세미콜론(;) 입력한다.

dfs -ls /;

 

 

하이브에서 dfs 명령을 사용하는것이 배시쉘에서 hadoop dfs 동일한 명령을 사용하는것보다 효율적이다. 하이브는 현재 프로세스에서 명령을 수행하는 반면, 배시쉘을 사용할때에는 새로운 jvm 인스턴스를 구동하여 명령을 실행하기 때문이다. 아래와 같이 -help 사용하면 dfs에서 제공하는 도움말을 있다.

 

 

 

 

 

2020-05-18 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, Hive, 하이브, 하둡 쿼리, 하이브쿼리, hive query

'SW Engineering > Hadoop' 카테고리의 다른 글

Hive 데이터 타입  (0) 2020.06.09
HDFS 데이터 저장소에는 RAID구성이 필요할까  (0) 2020.06.08
ZooKeeper 옵저버와 CLI  (0) 2020.05.19
Hive에서 쉘 명령 실행  (0) 2020.05.18
ZooKeeper 클라이언트 요청 처리  (0) 2020.05.18

ZooKeeper 옵저버와 CLI

 

·       Version : Zookeeper

 

주키퍼는 리더가 모든 서버에 쓰기 요청을 보내고 과반수 이상의 응답을 받은 처리한다. 주키퍼 서버에 연결되는 클라이언트수가 많으면, 서버를 확장하여 읽기에 대한 부하분산이 가능하다. 하지만 서버가 늘어날 경우, 쓰기 연산 발생시 전체 서버에 대해서 응답을 기다려야 하기 때문에, 그만큼 성능 저하가 발생할 있다. 이러한 문제를 해결하기위해 옵저버 개념이 도입되었다.

옵저버는 투표에 참여하지 않는 서버를 뜻한다. 리더는 쓰기 요청을 받고 서버로 쓰기에 대한 응답을 보내고 받을때, 옵저버 서버에는 보내지 않는다. 그리고 일반 서버의 투표에 의한 정상 처리인 경우, 쓰기 요청을 옵저버로 보내 옵저버의 로컬 메모리에 데이터를 기록한다. 서버가 옵저버로 동작하게 하려면 옵저버 서버의 환경설정에 아래와 같은 값을 입력한다.

peerType=observer

 

그리고 모든 서버의 환경 설정에 옵저버 서버의 정보를 추가하여 투표 요청을 하지 않도록 한다. 아래 예시는 192.168.0.2 서버가 observer 서버라는 정보를 환경 설정에 등록한 것이다.

Server.1:192.168.0.2:2181:3181:observer

 

주키퍼는 CLI(Command Lind Interface)기반의 프로그램을 제공한다. 클라이언트 쉘을 실행하려면 아래와 같은 명령을 입력 한다.

bin.zkCli.sh ?server 127.0.0.1:2181

 

아래표는 CLI 명령어와 설명이다.

command

Description

connect host:port

주키퍼 서버에 접속한다.

get path

노드에 저장된 데이터를 보여준다.

ls path

노드의 자식 노드 목록을 조회한다.

set path data

노드의 데이터를 수정한다.

delquota [-n|-b] path

노드의 사용 용량 설정 정보를 삭제 한다.

quit

쉘을 종료 한다.

printwatches on|off

와처에서 받은 이벤트 정보를 콘솔에 출력할지 여부를 설정한다.

create [-s][-e] path data acl

노드를 생성한다. -s옵션은 순차노드를 생성, -e 임시노드를 생성한다.

stat path

패스의 상태 정보를 조회한다.

close

주키퍼 접속을 종료한다.

ls2 path

ls stat명령을 동시에 수행시킨 내용을 보여준다.

history

수행한 명령어 목록을 보여준다.

listquota path

패스에 설정된 용량 설정 정보를 보여준다.

setAcl path acl

패스에 권한을 설정한다.

getAcl path

패스의 ACL 목록을 조회한다.

sync path

패스에 sync 명령을 보낸다.

redo cmdno

쉘에서 이전에 실행했던 명령을 다시 실행한다.

addauth scheme auth

현재 오픈되어 있는 쉘의 주키퍼 연결에 인증 정보를 추가한다.

delete path

패스를 삭제한다.

 

 

 

2020-05-18 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, 주키퍼, Zookeeper, 분산 코디네이션

Hive에서 명령 실행

 

·       Version : Hive

 

하이브(Hive)에서 간단한 배시 (bash shell) 명령을 수행할 있다. 더이상 쉘을 수행하기 위해서 하이브 CLI 빠져나갈 필요가 없다. 하이브에서 쉘을 실행하는 방법은 ! 뒤에 명령어를 입력하고, 명령어 마지막에 세미콜론(;) 입력한다. 아래 예시는 간단히 에코로 문자를 반환하는 것과, 현재 경로를 표시한다.

! /bin/echo “Hello”;

! pwd;

 

 

명령을 실행할때, 사용자 입력이 필요한 명령은 실행해서는 안된다. 파이프와 파일 글로빙(globbing) 동작하지 않는다. 예를들어 ! ls *.hql 명령은 *.hql 이름을 가지는 하나의 파일만 찾아줄뿐, .hql 확장자를 가진 모든 파일을 찾아서 보여주지는 않는다.

 

 

2020-05-17 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, Hive, 하이브, 하둡 쿼리, 하이브쿼리, hive query

ZooKeeper 클라이언트 요청 처리

 

·       Version : Zookeeper

 

주키퍼의 모든 서버는 클라이언트로 부터 읽기, 쓰기 요청을 받을 있다. 읽기 요청은 클라이언트가 접속한 서버의 로컬 데이터를 이용한다. 쓰기 요청을 받은 서버는 리더 서버로 리다이렉트 한다.

 

 

리더는 새로운 트랜잭션아디이(zxid) 생성한 모든 팔로워에게 쓰기 요청을 보낸다. 쓰기 요청을 받은 서버는 자기의 로컬 트랜잭션 로그 파일에 처리 내역을 저장하지만 실제 메모리에는 반영하지 않고, 리더로 ACK 신호를 보낸다. 리더는 과반수 이상의 팔로워로부터 ACK 신호를 받으면 메모리에 반영하라고 하는 커밋 신호를 보낸다. 커밋 신호를 받은 팔로워는 자신의 메모리에 쓰기 요청된 정보를 반영한다. 팔로워 클라이언트로 부터 요청을 받은 서버는 클라이언트로 처리 결과를 보낸다. 아래 그림에서 순서를 쉽게 확인할 있다.

 

 

 

 

주피커는 이벤추얼한 정합성을 가지고 있는데, 동일 데이터에 대해 쓰기나 읽기가 서로 다른 클라이언트에서 서로 다른 주키퍼 서버에 접속하면 읽기 연산을 수행하는 클라이언트에는 반영되기 전의 데이터가 읽혀질 가능성이 크다. 그래서 강한 정합성을 필요로 하는 애플리케이션이나 기능에서는 sync() 메소드를 이용하여 해결할 있다. Sync() 메소드는 파라미터로 전달된 패스에 대해 모든 주키퍼 서버가 처리 중인 쓰기 연산을 로컬 메모리에 모두 반영하는것을 보장하는 메소드다.

 

주키퍼 서버에 장애가 발생하면 클라이언트 측에서는 Disconnected 이벤트가 발생하고, 클라이언트 라이브러리에서는 자동으로 다른 서버로 접속을 시도한다. 주키퍼 클라이언트는 자신이 실행한 최종 트랜잭션 아이디(zxid) 메모리에서 관리한다. 주키퍼 서버는 자신의 트랜잭션아이디보다 값을 가지고 있는 클라이언트의 접속 요청은 거절한다.

 

 

 

2020-05-17 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, 주키퍼, Zookeeper, 분산 코디네이션

'SW Engineering > Hadoop' 카테고리의 다른 글

ZooKeeper 옵저버와 CLI  (0) 2020.05.19
Hive에서 쉘 명령 실행  (0) 2020.05.18
ZooKeeper 멀티 서버 구성  (0) 2020.05.17
ZooKeeper 리더선출과 데이터 ACID 정책  (0) 2020.05.14
Zookeeper 세션(Session)  (0) 2020.05.13

ZooKeeper 멀티 서버 구성

 

·       Version : Zookeeper

 

주키퍼를 멀티서버로 구성하려면 서버에 멀티서버에 대한 정보를 추가해야 한다. 주피커 설치 디렉터리에서 conf/zoo.cfg 파일에 아래와 같이 정보를 입력 한다.

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/data/zookeeper

clientPort=2181

 

server.1=192.168.1.1:2888:3888

server.2=192.168.1.2:2888:3888

server.3=192.168.1.3:2888:3888

 

zoo.cfg 파일에서 서버 만큼 server.x=IP:Port:Port 입력한다. server 예약어이며, x 서버를 식별하는 ID 숫자를 입력한다. IP 서버의 IP 입력하고, 첫번째 포트는 리더에 접속하기 위한 포트이며, 두번째 포트는 리더를 선출하는데 사용되는 포트이다. 위에서 생성한 설정 파일을 서버에 복사하고, 서버의 데이터 디렉터리에 myid 라는 파일을 만들어서 해당 서버의 아이디를 입력한다. 아래 예제는 서버1에서 데이터 경로가 /data/zookeeper 사용하였다.

vi /data/zookeeper/myid

1 #숫자 입력 종료

 

설정이 완료되고 서버에서 주키퍼 서버를 시작하면, 멀티서버 주키퍼 클러스터로 동작한다. 멀티서버 구성에는 실행되고 있는 서버의 수가 과반수(등록된 서버 + 1)/2) 이하이면 동작하지 않는다. 예를들어 클러스터가 3대일때, 2대의 서버 장애가 발생하면 서비스가 중지 된다. 아래 스크립트는 주키퍼 서버를 시작하는 명령어이다.

bin/zkServer.sh start

 

서버에서 주키퍼를 시작하면 첫번째 서버 시작시 오류 메시지가 나타나는데, 멀티서버로 설정된 주키퍼는 설정 파일에 있는 다른 서버에 접속해 리더 선출과정을 거쳐야 정상으로 작동되기 때문에 설정 파일에 등록된다른 서버를 시작하면 경고가 발생하지 않는다. 서버 메시지에서 “LEADING” 메시지가 표시된 서버가 리더로 선출된 서버이다.

 

아래 표는 주키퍼 환경 설정에 대한 속성과 설명이다.

속성

설명

clientPort

클라이언트로 요청을 받기 위한 포트

dataDir

메모리에 있는 데이터를 스냡샷으로 저장하는 디렉터리 경로

tickTime

주키퍼에서 사용되는 기본 시간 단위. 최소 세션타임아웃은 값의 2배이다.

dataLogDir

트랜잭션 로그를 저장하는 디렉터리. 특별한 설정을 하지 않으면 dataDir 저장. 성능상 다른 디스크의 디렉터리에 분리하는것이 좋다.

globalOutstandingLimit

큐가 많이 쌓이게 되면 메모리 부족으로 정상 작동하지 못하게 된다. 사이즈보다 많은 요청을 받지 못하도록 설정하는 값이며 기본값은 1000 이다.

preAllocSize

트랜잭션 로그 저장을 위해 미리 할당 받은 파일 사이즈. 기본값은 64MB 스냅샷을 자주 만들경우 값을 줄여서 사용한다.

snapCount

트랜잭션 회수가 snapCount 이상되면 메모리 내용을 스냅샷 파일로 저장하고 새로운 트랜잭션 파일을 만든다.

traceFile

설정이 켜져 있으면 클라이언트 요청을 traceFile.year.month.day 형태의 파일명에 저장한다. 주로 디버그 용도로 활용하며 설정이 켜져 있으면 오버헤드가 발생한다.

maxClientCnxns

클라이언트로 부터 동시에 접속할 있는 연결 수를 지정. 연결수는 클라이언트 IP 개수이며, 기본값은 10이며 0 무제한이다.

clientPortBindAddress

서버의 네트워 카드 IP 여러개 일때, 클라이언트가 접속할 서버의 IP주소나 호스트명을 지정한다. 기본값은 모든 IP 주소, 네트워크 카드에 접속 가능하다.

minSessionTimeout

최소 세션 타임아웃이며 단위는 밀리세컨드 (ms)이다. 기본값은 tickTime *2 이다.

maxSessionTimeout

최대 세션 타임아웃이며 단위는 밀리세컨드(ms)이다. 기본값은 tickTime *20 이다.

electionAlg

리더를 선출하는 알고리즘. 기본값은 3이다.
0 : UDP 기반의 기본 리더 선출

1 : UDP 기반의 비인증 빠른 리더 선출(FastLeaderElection)

2 : UDP 기반의 인증 빠른 리더 선출

3 : TCP 기반의 빠른 리더 선출

initLimit

초기에 팔로워가 리더에 접속하거나 데이터를 동기화 시키기 위한 시간으로 단위는 tickTime 이며 initLimit * tickTime으로 계산된다.

leaderServes

클라이언트의 요청을 리더가 받을 것인지에 대한 설정 기본값은 yes 이다. 쓰기 연산이 많은 경우, 리더가 클라이언트 요청을 받게되면 쓰기 연산에 대한 처리와 클라이언트로 부터의 읽기,쓰기 연산을 동시에 하게 되면서 많은 오버헤드가 발생한다. 경우 no 설정하는 것이 좋다.

server.x=ip:port:port

멀티 서버를 구성할 경우 서버 목록 지정. 앞의 포트는 리더에 접속하기 위한 포트이며, 번째는 리더를 선출하는 포트이다.

syncLimit

Sync 수행하는 시간으로 Tick기준이다. 시간동안 sync 안되면 해당 팔로워는 클러스터에서 제외된다.

group.x=id[:id]

계층적 정족수를 설정한다 x 그룹 아이디로 숫자 값을 설정한다. = 이후에는 그룹에 포함될 서버 아이디를 입력하며 구분자는 : 이다.

weight.x= n

서버간 정족수 투표를 할때 서버의 가중치를 설정. X 서버 아이디이며 n 가중치 값을 설정한다. 기본값은 1이다.

 

주키퍼는 자바로 개발되었으며 JVM(Java Virtual Machine)환경에서 운영된다. 그래서 JVM 대한 설정도 고려해야한다. JVM GC(Garbage Collection) 수행할때 모든 스레드가 멈추게 되는 경우도 있다. GC 수행되는 모든 모든 스레드가 동작하지 못하게 되면 예기치 못한 타임아웃이 발생하고, 클라이언트, 서버 모두 정상적인 상황임에도 세션을 유지하지 못하는 상태가 발생한다. 주키퍼 서버를 실행할 GC옵션을 아래와 같이 설정하며 GC 수행중에도 스레드가 동작할 있게 한다.

-XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC

 

외에도 성능이 저하되지 않도록 JVM 메모리 스왑이 발생하지 않도록 해야한다.

 

[참고자료]

·       Clustered (Multi-Server) Setup : https://zookeeper.apache.org/doc/r3.3.2/zookeeperAdmin.html#sc_zkMulitServerSetup

·       How To Install and Configure an Apache ZooKeeper Cluster on Ubuntu 18.04 : https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-an-apache-zookeeper-cluster-on-ubuntu-18-04

·       16 Tuning JVM Garbage Collection for Production Deployments : https://docs.oracle.com/cd/E40972_01/doc.70/e40973/cnf_jvmgc.htm#autoId0

 

 

 

2020-05-16 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, 주키퍼, Zookeeper, 분산 코디네이션

ZooKeeper 리더선출과 데이터 ACID 정책

 

·       Version : Zookeeper

 

주키퍼를 사용하여 분산 시스템을 관리할 경우 주키퍼는 반드시 멀티 서버로 운영해야한다. 멀티서버로 운영할 경우 네트워크 단절, 트랜잭션 타임아웃등의 상황에 대비해야한다. 특히 일부 주키퍼 서버 장애발생시 해당 서버에 접속된 클라이언트의 세션에 대한 처리, 장애복구 서버간 데이터 동기화 등이 고려되어야 한다. 주키퍼는 이러한 문제를 자체적으로 해결하기 때문에 마스터 서버 구성시 주키퍼를 사용함으로써 상대적으로 쉽게 해결할 있다.

 

주키퍼를 멀티서버로 설치하면 모든 서버는 동일한 데이터를 가지고 있다. 클라이언트는 모든 서버에 접속해서 읽기, 쓰기 요청을 보낼수 있다. 읽기 연산은 모든 데이터가 동기화 되어 있기 때문에 자체 서버에서 제공할 있지만, 쓰기연산은 특정 서버가 마스터 역할을 수행하면서 쓰기 작업이 정상적으로 수행되었는지 확인할 필요가 있다. 이러한 역할을 하는 서버를 리더(leader)라고 한다.

주키퍼는 클러스터내에서 자동으로 리더를 선출한다. 클러스터가 재시작되거나 장애가 발생하면 자동으로 리더를 선출하며 리더를 선출하는 방법 순서는 아래와 같다.

1.       서버는 자신의 현재 트랜잭션ID(zxid) 자신을 후보자로 지명해 모든 서버로 전송

2.       서버는 트랜잭션 아이디를 받은 자신이 최대값이 아니면 다시 최대값을 갖고 있는 서버를 후보자로 지명하여 모든 서버에 전송

3.       과반수 이상의 서버로부터 후보자로 지명된 서버는 리더로 선출

4.       다른 서버는 팔로워(follower) 동작

 

분산처리 시스템에서 ACID 속성중 정합성(Consistency) 독립성(Isolation) 보장하는것은 쉽지 않다. 주키퍼는 데이터 저장시 아래와 같은 사항을 보장한다.

·       순차적 정합성(Sequential Consistency) : 주키퍼 클러스터에 저장되는 데이터는 강한 정합성(Strong Consistency) 보장하지 않고, 이벤추얼 정합성(Eventual Consistency) 보장한다. 이벤추얼 정합성은 일정 시간이 지나면 정합성이 맞춰지는 속성이다. 특정 클라이언트로부터 데이터 저장에 대한 요청이 있을때 , 분산되어 있는 주키퍼 서버에 반영되는 순서는, 클라이언트에서 전송된 요청 순서대로 처리되는것을 보장한다.

·       원자성(Atomic) : 전체가 수행되거나 전체가 실패되는 행위로, 부분적인 성공은 존재하지 않는다.

·       단일 이미지 제공 (Single System Image) : 클라이언트는 어떤 주키퍼 서버에 접속하더라도 동일한 데이터 뷰를 제공 받는다.

·       안정성 (Reliability) : 주키퍼에 저장된 데이터는 클라이언트의 명시적인 호출에 의해 수정되지 않는한 영속성을 가지고 있다.

 

 

 

2020-05-13 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, 주키퍼, Zookeeper, 분산 코디네이션

'SW Engineering > Hadoop' 카테고리의 다른 글

ZooKeeper 클라이언트 요청 처리  (0) 2020.05.18
ZooKeeper 멀티 서버 구성  (0) 2020.05.17
Zookeeper 세션(Session)  (0) 2020.05.13
Zookeeper 접근제한(Access Control List)  (0) 2020.05.11
ZooKeeper Stat Structure  (0) 2020.05.08

Zookeeper 세션(Session)

 

·       Version : Zookeeper

 

주키퍼에서 세션(session)  주키퍼 서버와 클라이언트의 연결을 의미한다. 세션 상태는 5가지가 있다.

·       Connecting : 클라이언트가 주키퍼 서버와 연결을 시도하고 있는 상태이다.

·       Connected : 서버와 연결된 상태로, z노드에 연산을 수행할 있는 상태이다.

·       Closed : close() 메소드에 의해 명시적으로 연결을 종료했거나, 세션 타임아웃, 인증 실패 등으로 서버와 연결이 종료된 상태

·       Disconnected : 시스템 장애, 네트워크 장애등으로 서버와의 접속이 끊긴 상태이다. Disconnected 상태에서는 클라이언트가 자동으로 파라메터로 받은 서버 대에 다시 접속을 시도하며, 이때. 서버 접속시 발급받은 64비트의 세션 아이디를 재접속시 사용하여 세션값을 계속 유지 있다. Disconnected 상태에서는 임시노드는 삭제되지 않는다.

·       Session Expired : 세션 타임아웃 시간동안 세션 유지 요청이 없으면 세션을 무효화한다. 세션 타임아웃 시간을 너무 짧게 설정하면 세션이 너무 자주 끊겨 임시 노드가 삭제되는 문제가 있으며, 타임 아웃 시간이 너무 길면 Session Expired 상태에 대한 이벤트를 받는데 오래 걸린다.

 

 

주키퍼는 세션 연결과 읽기 연산시 이벤트를 받을 있는 와처(watcher) 설정하는 기능을 제공한다. 와처는 세션의 상태가 변경되었거나 관심 있는 노드의 상태가 변경되었을때 클라이언트가 이벤트를 받아 처리할 있게 하는 기능을 제공한다. 와처는 옵저버(Observer) 패턴을 취하고 있어 이벤트 대상에 콜백 객체를 등록하고 조건에 만족한 이벤트가 발생하면 콜백 객체로 등록된 와처를 호출하는 방식을 취한다.

 

클라이언트가 주키퍼 서버에 연결되면 Peer-To-Peer FIFO 네트워크 채널을 생성한다. 네트워크 채널은 세션이 종료될 때까지 유지한다. , 한번 생성된 소켓은 계속 사용한다. 특정 z노드에 와처를 등록하면 클라이언트에서는 메모라에 와처 객체를 등록한다. 주키퍼 서버로는 z노드의 패스와 클라이언트 호스트 정보를 전달하고, 서버에는 z노드와 와처를 등록한 클라이언트 목록을 가지고 있으며 z노드 상태가 변경되서을때 와처 목록에 있는 클라이언트로 변경 내역을 전송한다. 주키퍼 와처는 한버 이벤트를 받으면 등록된 와처는 삭제된다. 따라서 이벤트를 계속 받기 위해서는 와처를 계속 등록해야 한다.

 

[참고자료]

·       ZooKeeper Sessions : https://zookeeper.apache.org/doc/r3.3.5/zookeeperProgrammers.html#ch_zkSessions

·       ZooKeeper Watches : https://zookeeper.apache.org/doc/r3.3.5/zookeeperProgrammers.html#ch_zkWatches

 

 

 

2020-05-12 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, 주키퍼, Zookeeper, 분산 코디네이션

Zookeeper  접근제한(Access Control List)

 

·       Version : Zookeeper

 

주키퍼의 패스와 노드에 대한 권한 관리는 상속되지 않는다. 뜻은 부모 노드와 자식 노드가 있을때, 부모의 노드의 권한 속성이 자식 노드로 권한 상속이 발생하지 않다는 것이다. 그리고 아무런 설정을 하지 않으면 누구나 접근이 가능하다.

접근권한은 [schema:id, permission] 같은 형태로 설정한다. Schema 인증방법을 정의하고, id 인증을 허용할 값을 정의, permission에는 처리할 있는 기능을 정의한다.

ex) 특정IP 가진 클라이언트에 읽기(read) 권한 부여 : ip:192.168.0.1, READ

·       CREATE : 자식 노드를 생성할 있는 권한

·       READ : 데이터를 읽거나 자식노드를 조회할 있는 권한

·       WRITE : 데이터를 수정할 있는 권한

·       DELETE : 자식 노드를 삭제 있는 권한

·       ADMIN : 권한을 설정할 있는 권한

 

접근제한에서 사용할 있는 스키마 목록은 아래와 같다.

·       world : 모든 사용자가 접근 가능한 스키마

·       auth : 접근 권한을 설정하기 위한 스키마 (실제 클라이언트에서 사용할 경우는 거의 없음)

·       digest : “사용자명 : 패스워드방식으로 접근권한을 설정하기 위한 스키마

·       host :  호스트명을 이용해 접근 권한을 설정하기 위한 스키마

·       ip : 클라이언트 IP 이용해 접근 권한을 설정하기 위한 스키마 (IP값은 addr/bits 형태의 비트마스크 사용 가능)

 

ACL 목록 생성시 동일한 퍼미션에 대해 다른 Id 객체가 있으면 마지막에 설정한 Id 객체의 설정만 반영된다.

 

아래 코드는Zookeeper ACL 상호 작용하는 방법을 C 만든 예제이다.

#include <string.h>

#include <errno.h>

 

#include "zookeeper.h"

 

static zhandle_t *zh;

 

/**

 * In this example this method gets the cert for your

 *   environment -- you must provide

 */

char *foo_get_cert_once(char* id) { return 0; }

 

/** Watcher function -- empty for this example, not something you should

 * do in real code */

void watcher(zhandle_t *zzh, int type, int state, const char *path,

             void *watcherCtx) {}

 

int main(int argc, char argv) {

  char buffer[512];

  char p[2048];

  char *cert=0;

  char appId[64];

 

  strcpy(appId, "example.foo_test");

  cert = foo_get_cert_once(appId);

  if(cert!=0) {

    fprintf(stderr,

            "Certificate for appid [%s] is [%s]\n",appId,cert);

    strncpy(p,cert, sizeof(p)-1);

    free(cert);

  } else {

    fprintf(stderr, "Certificate for appid [%s] not found\n",appId);

    strcpy(p, "dummy");

  }

 

  zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG);

 

  zh = zookeeper_init("localhost:3181", watcher, 10000, 0, 0, 0);

  if (!zh) {

    return errno;

  }

  if(zoo_add_auth(zh,"foo",p,strlen(p),0,0)!=ZOK)

    return 2;

 

  struct ACL CREATE_ONLY_ACL[] = {{ZOO_PERM_CREATE, ZOO_AUTH_IDS}};

  struct ACL_vector CREATE_ONLY = {1, CREATE_ONLY_ACL};

  int rc = zoo_create(zh,"/xyz","value", 5, &CREATE_ONLY, ZOO_EPHEMERAL,

                      buffer, sizeof(buffer)-1);

 

  /** this operation will fail with a ZNOAUTH error */

  int buflen= sizeof(buffer);

  struct Stat stat;

  rc = zoo_get(zh, "/xyz", 0, buffer, &buflen, &stat);

  if (rc) {

    fprintf(stderr, "Error %d for %s\n", rc, __LINE__);

  }

 

  zookeeper_close(zh);

  return 0;

}

 

 

[참고자료]

·       ZooKeeper ACL Permissions : https://zookeeper.apache.org/doc/r3.1.2/zookeeperProgrammers.html#sc_ACLPermissions

 

2020-05-10 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, 주키퍼, Zookeeper, 분산 코디네이션

'SW Engineering > Hadoop' 카테고리의 다른 글

ZooKeeper 리더선출과 데이터 ACID 정책  (0) 2020.05.14
Zookeeper 세션(Session)  (0) 2020.05.13
ZooKeeper Stat Structure  (0) 2020.05.08
ZooKeeper 시간 동기화와 네임스페이스 z노드  (0) 2020.05.07
Zookeeper 소개  (0) 2020.05.06

ZooKeeper Stat Structure

 

·       Version : Zookeeper

 

주키퍼(Zookeeper) z노드에는 가지 속성이 있다.

·       Stat : z노드의 상태 정보를 저장

·       Watcher : 세션의 상태가 변경 되었거나 관심 있는 노드의 상태변경(생성, 수정, 추가, 삭제) 발생했을때 클라이언트가 이벤트를 받아 처리할 있게 하는 기능을 제공

·       Atomic : z노드에 대한 데이터의 조회와 저장은 원자성을 가진다.

·       Persistent Node : “Persistent” 옵션으로 생성된 z노드는 주키퍼 서버의 로컬 디스크에 영구히 저장되고 클라이언트의 삭제 요청에 의해서만 삭제된다. 따라서 주키퍼 서버가 재시작 되어도 데이터는 보존된다.

·       Ephemeral Node : 임시노드는 노드를 생성한 클라이언트와 세션이 종료되면 해당 노드도 자동으로 삭제된다. 임시 노드는 자식 노드를 가질수 없으며, 부모 노드는 반드시 Persistent 노드여야 한다.

·       Sequence Node : 시퀀스 노드는 특정 부모 노드의 아래에 있는 자식 노드에 노드의 이름 값이 순차적으로 증가하는 번호를 부여하는 노드를 만들때 사용한다.

 

아래 표는 Stats 정보이다.

setAcl /newznode world:anyone:crdwa

 

 

Stat

Description

czxid

z노드의 생성 트랜잭션에 사용된 zxid

mzxid

z노드의 마지막 수정 트랜잭션에서 사용된 zxid

ctime

z노드가 생성된 시스템 시간

mtime

z노드가 마지막 수정된 시스템 시간

version

z노드가 수정된 횟수

cversion

z노드의 자식의 갯수가 수정된 횟수

aversion

z노드의 ACL 수정된 횟수

ephemeralOwner

임시 노드이면 z노드가 생성한 클라이언트의 세션 아이디이고, 임시 노드가 아니면 0

dataLength

데이터 필드의 길이

numChildren

z노드의 자식

 

 

[참고자료]

·       ZooKeeper Stat Structure : https://zookeeper.apache.org/doc/r3.1.2/zookeeperProgrammers.html#sc_zkStatStructure

 

 

2020-05-07 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, 주키퍼, Zookeeper, 분산 코디네이션

ZooKeeper 시간 동기화와 네임스페이스 z노드

 

·       Version : Zookeeper

 

주키퍼(Zookeeper) 하나 이상의 서버에서 수행되기 때문에 클라이언트의 처리 요청에 따라 버전 정보나, 시간정보등에 대해서 모든 주키퍼 서버가 공유해야한다. 주피커는 아래와 같은 방법으로 시간이나 버전 정보를 관리한다.

·       Zxid (Zookeeper Transaction Id) : 주키퍼 노드의 상태를 변경하는 요청에 대해 부여되는 트랜잭션ID, 모든 변경 요청에 대해서 순차적으로 부여된다. zxid 낮을 수록 먼저 요청되었다는 것을 보장한다.

·       Version numbers : 노드의 데이터가 변경될때 마다 버전 값이 증가. 버전에는 z노드 데이터 변경, 자식 노드의 변경, AC 변경이 있으며 각각 다른 버전이 부여된다.

·       Tick time : 세션 타임아웃, 커넥션 타임아웃 등과 같은 이벤트의 경과 시간을 의미.

·       Real time : 대부분의 경우에 시스템 시간을 사용하지 않지만, 노드의 생성, 수정 일시에 대한 정보는 시스템 시간을 사용한다.

 

주키퍼는 파일 시스템과 유사한 계층적인 네임 스페이스를 제공한다. 이러한 노드를 z노드(znode)라고 한다. z노드는 아래와 같은 특징이 있다.

·       부모 노드에도 데이터 저장 가능

·       크기가 작은 데이터 위주로 저장 (서버의 상태, 정보, 환경 설정등과 같은 크기가 작은 메타 데이터)

·       버전 : z노드에 저장되는 모든 데이터는 버전을 가지고 있음

·       접근권한 : z노드 단위로 권한(ACL) 관리 가능

 

주키퍼 클라이언트는 라이브러리는 대부분 z노드 연산과 관련이 있으며 클라이언트 라이브러리는 JAVA, C, Python, Perl등을 지원한다. 주키퍼 클라이언트 API Zookeeper이라는 클래스를 사용하며 클래스의 생성자에는 3개의 파라메터가 있다.

·       주키퍼 서버 목록 : 콤마(,) 구분하여 구분한다. (EX : server1:2181, server2:2181…) 서버 정보에 루트 패스를 지정할수도 있으며 노드 정보를 같이 입력해주면(EX : server3:2181/app/myapp1)  해당 노드를 루트 노드로 인식한다.

·       세션 타임아웃 : 주키퍼 서버와 클라이언트 연결에 대한 타임아웃으로 단위는 밀리초(ms) 이다.

·       와처(watcher) : 이벤트 리스너를 등록한다.

 

주키퍼 클라이언트 API 동기, 비동기 방식을 모두 지원한다. 비동기 호출을 하더라도 처리되는 순서는 주키퍼 서버에 의해 보장 된다. 아래표는 주키퍼 클라이언트 API 대한 설명이다.

API

설명

exists

특정 노드가 존재하는지 확인. 반환값이 NULL이면 존재하지 않음

create

노드를 생성. 노드 생성시 최대1MB 까지 데이터 함께 저장가능. 이미 노드가 존재하면 KeeperException, NodeExistsException 발생.

delete

특정 노드를 삭제. 노드가 존재하지 않으면 KeeperException, NodeExistsException 발생.

getData

노드의 데이터를 가져옴

setData

노드의 데이터를 설정. 버전이 맞지 않으면 Exception발생. 버전 값이 -1이면 버전에 상관없이 데이터 저장

getChildren

노드의 자식 목록을 가져옴

sync

주키퍼의 모든 서버에 복제본이 저장될때 까지 기다림

 

 

[참고자료]

·       Time in ZooKeeper : https://zookeeper.apache.org/doc/r3.1.2/zookeeperProgrammers.html#sc_timeInZk

·       ZooKeeper | Command Line Utilities: "zkCli" : http://www.mtitek.com/tutorials/zookeeper/zkCli.php

·       Zookeeper - CLI : https://www.tutorialspoint.com/zookeeper/zookeeper_cli.htm

 

 

 

2020-05-06 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, 주키퍼, Zookeeper, 분산 코디네이션

'SW Engineering > Hadoop' 카테고리의 다른 글

Zookeeper 접근제한(Access Control List)  (0) 2020.05.11
ZooKeeper Stat Structure  (0) 2020.05.08
Zookeeper 소개  (0) 2020.05.06
HUE에서 10만행이상 브라우저에 출력하기  (0) 2020.02.19
Hive 쿼리 - not like  (0) 2020.02.13

Zookeeper 소개

 

·       Version : Zookeeper

 

주키퍼(Zookeeper) 분산 코디네이터 서비스(Distributed Coordinator Service) 제공하는 아파치 오픈소스이다. 분산 환경에서 , 네이밍 서비스, 클러스터 멤버십 등을 쉽게 구현할 있는 기능을 제공한다. (주키퍼 자체적으로 기능을 제공하지 않으며, 기능을 쉽게 만들 있는 메커니즘을 제공) 주키퍼를 이용하는 대표적인 사례는 아래와 같다.

·       네임 서비스, 환경설정, 그룹 멤버십

·       Double Barriers

·       우선순위 (Priority Queues)

·       공유 제어

·       단계 커밋 (Tow-phased commit)

·       리더 선출

 

주키퍼는 n개의 서버와 클라이언트 API 구성되어 있으며, 서버는 파일 시스템과 비슷한 형태로, 데이터를 계층적으로 저장한다. 저장된 데이터는 주키퍼 서버들 사이에 복제되어 운영되기 때문에 일부 서버에 장애가 발생하더라도 전체 장애로 이어지지는 않는다.

 

 

주키퍼 서버에 데이터 추가, 삭제, 변경 등과 같은 상태 변경이 발생하면, 주키퍼 서버는 클라이언트로 변경 사항을 전달하는 이벤트를 발생 시킨다. 주키퍼 클라이언트 라이브러리는 단순한 가지 연산만 제공하며, 사용자 어플리케이션은 라이브러리를 이용하여 주키퍼 서버에 데이터를 저장, 삭제하는 연산을 수행하거나 이벤트를 등록한다.

·       create : creates a node at a location in the tree

·       delete : deletes a node

·       exists : tests if a node exists at a location

·       get data : reads the data from a node

·       set data : writes data to a node

·       get children : retrieves a list of children of a node

·       sync : waits for data to be propagated

 

주키퍼는 파일 시스템과 유사한 계층적인 네임스페이스를 제공한다. 하지만 일반적인 파일 시스템과 달리, 주키퍼에서는 모든 노드에 데이터를 저장할 있다. 주키퍼는 클라이언트 라이브러리를 이용해 네임 스페이스에 대한 조회나 노드에 저장된 데이터를 원격 클라이언트에서 접근할 있다.

주키퍼 노드를 식별하는 식별자는 파일 시스템 디렉터리 구조와 동일하게 ‘/’ 구분되는 문자열이다. 상대 경로를 나타내는 ‘.’, ‘..’ 사용시 주의해야한다. 패스(path)명으로 사용할 수는 있지만 상대 경로가 아닌 문자 자체로 인식하기 때문이다. 아래 케이스는 패스에 사용할 없다.

·       Null 문자(0x00)

·       \u001 - \u0019, \u007F - \u009F

·       \ud800 - \uF8FFF, \uFFF0 - \uFFFF, \uXFFE - \uXFFFF, \uF0000 - \uFFFF

·       zookeeper : 시스템에서 사용하는 예약어

 

주키퍼의 모든 데이터는 서버 메모리에 저장하기 때문에 주키퍼에 저장할 있는 데이터 용량은 주키퍼 데몬 서버가 할당받은 메모리 영역을 초과할 없다. 따라서 일반적으로 시스템 관리, 모니터링, 관리등에 필요한 메타 정보만 저장한다. 데이터는 메모리에 존재하지만 트랜잭션 로그와 스냅샷 파일은 로컬 디스크에 저장하여 주키퍼 서버를 재시작 하였을 때에도 데이터는 그대로 유지된다.

 

 

[참고자료]

·       https://zookeeper.apache.org/doc/r3.6.1/zookeeperOver.html

 

 

2020-05-05 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, 주키퍼, Zookeeper, 분산 코디네이션

'SW Engineering > Hadoop' 카테고리의 다른 글

ZooKeeper Stat Structure  (0) 2020.05.08
ZooKeeper 시간 동기화와 네임스페이스 z노드  (0) 2020.05.07
HUE에서 10만행이상 브라우저에 출력하기  (0) 2020.02.19
Hive 쿼리 - not like  (0) 2020.02.13
Hive 파일 압축  (0) 2020.02.07

HUE에서 10만행이상 브라우저에 출력하기

 

·       Version : Hadoop 3.0.0-cdh6.3.2, Hive, HUE

 

HUE(haddop User Experience) Apache Hadoop 클러스터와 함께 사용되는 에코시스템으로 Hive Impala, Spark Job등을 쉽게 질의할 있는 기반 사용자 인터페이스이다.

 

필자의 HUE 사용환경은 CDH(Cloudera Hadoop) 6.3버전에서 제공되는 에코 시스템으로 설치하였으며, Hive Impala 데이터 조회에 주로 사용하고 있다.

 

데이터를 분석팀에서 하둡을 주로 사용하는데, HUE에서 데이터 조회시 10만행 이상의 결과는  브라우저에 출력이 되지 않아 데이터를 다운로드 받지 못하니 해결해 달라는 요청이 있었다. 브라우저에 데이터가 노출되지 않으니 당연히 브라우저에서 다운로드 받은 엑셀파일에서도 데이터가 존재하지 않았다.

문제를 해결하기 위해서 HUE 환경설정에서 아래오 같이 -1값으로 설정하여 출력결과를 무제한으로 표시할 있도록 하였다.

[beeswax]

# A limit to the number of rows that can be downloaded from a query before it is truncated.

# A value of -1 means there will be no limit.

download_row_limit=-1

 

 


HUE 브라우저에서 대용량의 결과셋을 출력한다는 것은 시스템 성능에 문제를 발생시킬 있으므로 권장하지 않는다. 대용량 결과를 출력해야하는 경우, Hive Impala에서 직접 파일로 출력하여 사용하는것이 좋다.

INSERT OVERWRITE LOCAL DIRECTORY '/your_path'

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ':'

SELECT * FROM tablename;

 

 

 

 

2020-02-18 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석,  Hive, Hive 쿼리, Hive Query, 하이브 쿼리, HUE 사용, HUE 데이터, HUE 대용량 결과, HUE download_row_limit

'SW Engineering > Hadoop' 카테고리의 다른 글

ZooKeeper 시간 동기화와 네임스페이스 z노드  (0) 2020.05.07
Zookeeper 소개  (0) 2020.05.06
Hive 쿼리 - not like  (0) 2020.02.13
Hive 파일 압축  (0) 2020.02.07
Hive 파일 Merge  (0) 2020.02.04

Hive 쿼리 - not like

 

·       Version : Hadoop 3.0.0-cdh6.3.2, Hive

 

Hive  또는 SQL에서 데이터를 조회할때, 특정 문자열이 포함되지 않는 데이터를 조회할때, WHERE 조건자에 not like ‘%something %’ 구문을 사용한다. 하지만 Hive SQL 에서 사용하는 문법은 약간 다르다. 아래 예제를 참고한다.

 

Query

SQL

select * from tableName where columnName not like '%something%';

Hive

select * from tableName where not (columnName like '%something%');

 

여러 조건을 적용하여 조회하는 경우 아래와 같은 쿼리를 사용할 있다. 아래 스크립트 예제는 col1 컬럼값이 ‘where1’ 이면서 col2 컬럼값이 ‘something’ 포함하지 않는 데이터를 조회한다.

select

       *

from tableName

where col1 = 'where1'

       and col2 = not (columnName like '%something%');

 

 

 

2020-02-12 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석,  Hive, Hive 쿼리, Hive Query, 하이브 쿼리, Hive not like, 하이브 조건 쿼리

'SW Engineering > Hadoop' 카테고리의 다른 글

Zookeeper 소개  (0) 2020.05.06
HUE에서 10만행이상 브라우저에 출력하기  (0) 2020.02.19
Hive 파일 압축  (0) 2020.02.07
Hive 파일 Merge  (0) 2020.02.04
Hive 통계 정보  (0) 2020.01.29

Hive 파일 압축

 

·       Version : Hadoop 3.0.0-cdh6.3.2, Hive

 

하이브를 이용하여 INSERT DIRECTORY, CTAS문으로 파일을 생성할때, 원하는 타입의 형태로 파일을 압축 있다. 하이브에서 사용할 있는 압축 코덱은 다양하다.

·       4mc com.hadoop.compression.fourmc.FourMcCodec

·       gzip org.apache.hadoop.io.compress.GzipCodec

·       lzo com.hadoop.compression.lzo.LzopCodec

·       Snappy org.apache.hadoop.io.compress.SnappyCodec

·       bzip2 org.apache.hadoop.io.compress.BZip2Codec

·       lz4 org.apache.hadoop.io.compress.Lz4Codec

·       org.apache.hadoop.io.compress.GzipCodec

·       org.apache.hadoop.io.compress.DefaultCodec

·       org.apache.hadoop.io.compress.BZip2Codec

·       org.apache.hadoop.io.compress.SnappyCodec

·       com.hadoop.compression.lzo.LzoCodec

·       com.hadoop.compression.lzo.LzopCodec

 

압축 하기 위해서는 io.compression.codecs 설정에 압축 포맷이 명시되어 있어야 한다.

<property>

              <name>hive.exec.compress.intermediate</name>

              <value>true</value>

</property>

 

<property>

              <name>hive.exec.compress.output</name>

              <value>true</value>

</property>

 

<property>

              <name>mapred.map.output.compression.codec</name>

               <value>com.hadoop.compression.fourmc.FourMCHighCodec</value>

</property>

 

압축을 사용하기 위해서는 쿼리를 실행 하기전 처리 결과를 압축하기위한 설정과 코덱을 명시해야한다.

set hive.exec.compress.output=true;

set mapreduce.output.fileoutputformat.compress=true;

set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;

 

아래 스크립트는 Gzip으로 압축한다. 압축파일은 지정한 경로에 생성되며 파일 개수는 매퍼와 리듀서의 개수만큼 생성된다.

set hive.exec.compress.output=true;

set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;

 

--table 내용을 /user/tables/ 경로에 CSV 형태로 압축 저장

INSERT OVERWRITE DIRECTORY 'hdfs:///user/tables/'

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

SELECT *

  FROM table

;

 

--table 내용을 temp_table 테이블에 저장

CREATE TABLE csvsample

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

LOCATION '/user/csv/'

AS

SELECT *

  FROM table

;

 

Hive에서압축 코덱을 사용하면 디스크 소비를 줄이면서 쿼리의 전체 시간 간격을 축소 있다.

 

[참고자료]

·       https://acadgild.com/blog/hive-compression-codecs

·       https://cwiki.apache.org/confluence/display/Hive/CompressedStorage

·       https://cwiki.apache.org/confluence/display/Hive/FileFormats

 

 

 

2020-02-06 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석,  Hive, Hive 쿼리, Hive Query, 하이브 파일 압축, Hive File compression

'SW Engineering > Hadoop' 카테고리의 다른 글

HUE에서 10만행이상 브라우저에 출력하기  (0) 2020.02.19
Hive 쿼리 - not like  (0) 2020.02.13
Hive 파일 Merge  (0) 2020.02.04
Hive 통계 정보  (0) 2020.01.29
Hive 쿼리 실행계획 보기  (0) 2020.01.17

Hive 파일 Merge

 

·       Version : Hadoop 3.0.0-cdh6.3.2, Hive

 

하이브에서 매퍼 단독 작업의 경우 파일이 많이 생성될 있다. 작은 사이즈의 파일이 많이 생성되면 HDFS 부담이 될수 있기 때문에 이럴 경우 파일을 Merge 하여 실행하는 것이 좋다. 아래 스크립터는 파일을 Merge 하는 설정이다.

-- 맵퍼 단독 작업일 머지

set hive.merge.mapfiles=true;

 

-- 맵리듀스 작업일 머지

set hive.merge.mapredfiles=true;

 

-- 테즈 작업일 머지

set hive.merge.tezfiles=true;

 

--테즈에서 실행하는지 확인

SET hive.execution.engine;

 

--테즈 엔진으로 설정

SET  hive.execution.engine=tez;

 

-- 머지 작업의 대상이 되는 파일 사이즈(32MB이하)

set hive.merge.smallfiles.avgsize=32000000;

 

-- 머지 파일을 묶을때 기준(256MB)

set hive.merge.size.per.task=256000000;

 

파일 Merge 할때, 너무 작은 크기의 파일을 대량으로 Merge 경우 Merge 하는 시간이 오래 걸릴수 있으니 주의해서 사용해야 한다.

 

 

2020-02-03 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석,  Hive, Hive 쿼리, Hive Query, 하이브 파일 머지, Hive File Merge

'SW Engineering > Hadoop' 카테고리의 다른 글

Hive 쿼리 - not like  (0) 2020.02.13
Hive 파일 압축  (0) 2020.02.07
Hive 통계 정보  (0) 2020.01.29
Hive 쿼리 실행계획 보기  (0) 2020.01.17
YARN Node Labels (노드 레이블)  (0) 2020.01.16

Hive 통계 정보

 

·       Version : Hadoop 3.0.0-cdh6.3.2, Hive

 

하이브는 테이블의 로우 , 파일 개수, 사이즈 등의 통계 정보를 이용하여 데이터를 빠르게 처리한다. 통계정보는 CBO(Cost Base Optimize) 방식이며, 실행계획 최적화, 단순 카운트 쿼리 등에 사용된다. 하이브는 기본적으로 통계 정보를 자동 수집하도록 되어 있어 따로 설정하지 않아도 테이블의 메타정보에 통계정보를 수집한다. 하지만 사용하는 버전, 제조사에 따라 설정이 다를 있으니 반드시 재확인을 있도록 한다. 통계 정보를 설정하는 옵션은 아래와 같다.

set hive.stats.autogather=true;

set hive.stats.column.autogather=true;

 

DML 이용하여 처리할 때는 통계 정보를 자동으로 수집하지만  파티션 위치에 파일을 직접 복사한 경우 메타데이터가 갱신되지 않아 통계 정보가 정확하지 않을 있다. 경우 Analyze명령을 사용하여 수동으로 통계 정보를 업데이트 할수 있다.

--tbl 테이블 통계정보 수집

ANALYZE TABLE tbl COMPUTE STATISTICS;

 

--tbl 테이블의 yymmdd '2020-01-01' 파티션의 통계정보 수집

ANALYZE TABLE tbl PARTITION(yymmdd='2020-01-01') COMPUTE STATISTICS;

 

--컬럼 통계정보 수집

ANALYZE TABLE tbl PARTITION(yymmdd='2018-01-01') COMPUTE STATISTICS FOR COLUMNS;

 

통계정보는 desc extended|formatted 명령으로 확인할 있으며, 테이블 정보, 파티션 정보에 통계정보가 추가되어 나타난다.

desc formatted tbl partition(yymmddval='20180101');

 

Table Parameters:               

        COLUMN_STATS_ACCURATE   {\"BASIC_STATS\":\"true\"}

        EXTERNAL                TRUE               

        last_modified_by        root             

        last_modified_time      1577490527         

        numFiles                9973               

        numPartitions           392                

        numRows                 2305106979         

        rawDataSize             12729039219        

        totalSize               717032673468       

        transient_lastDdlTime   1577490527

 

 

통계정보를 활용하기 위해서는 쿼리 호출시 통계 정보를 활용할 있도록 설정해야 한다. 아래 예제는 단순 count 하는 쿼리를 MapReduce 작업을 통하지 않고 통계정보를 이용하여 데이터를 확인할 있다.

set hive.compute.query.using.stats=true;

 

-- 통계정보를 활용하여 쿼리 실행

hive> select count(*) from tbl;

 

 

[참고자료]

·       https://cwiki.apache.org/confluence/display/Hive/StatsDev

·       https://wikidocs.net/26789

 

 

 

2020-01-28 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석,  Hive, Hive 쿼리, Hive Query, 하이브 통계, Hive Statistics, Hive CBO, 하이브 옵티마이저

'SW Engineering > Hadoop' 카테고리의 다른 글

Hive 파일 압축  (0) 2020.02.07
Hive 파일 Merge  (0) 2020.02.04
Hive 쿼리 실행계획 보기  (0) 2020.01.17
YARN Node Labels (노드 레이블)  (0) 2020.01.16
YARN 메모리 설정  (0) 2020.01.14

Hive 쿼리 실행계획 보기

 

·       Version : Hadoop 3.0.0-cdh6.3.2, Hive

 

하이브(Hive)에서 쿼리를 실행할때, 쿼리가 어떤 실행계획으로 결과를 추출했는지 확인하는 방법으로는 explain 또는 explain extended 명령을 사용할 있다.

EXPLAIN [EXTENDED|AST|DEPENDENCY|AUTHORIZATION|LOCKS|VECTORIZATION|ANALYZE] query

 

·       EXTENDED : 추가 정보 확인

·       AST : Abstract Syntax Tree 정보 확인

·       DEPENDENCY : 테이블간 의존 정보 확인

·       AUTHORIZATION : 테이블 조회 권한 정보 확인

·       LOCKS : 테이블의 정보 확인

·       VECTORIZATION : 벡터화 처리 정보 확인

·       ANALYZE : 실제 참조하는 row 정보 확인

 

 실행하려는 쿼리 앞에 explain 또는 explain extended명령을 함께 실행한다.

explain select * from tbl;

explain extended select * from tbl;

 

실행계획에는 쿼리를 실행하는 스테이지 정보, 스테이지에서 처리되는 작업의 정보가 출력된다.

hive> explain

    > select * from tbl_a where date = '20200114' and (url like '%XXXX%' and param like '%XXXX%')

    > ;

OK

STAGE DEPENDENCIES:

  Stage-1 is a root stage

  Stage-0 depends on stages: Stage-1

 

STAGE PLANS:

  Stage: Stage-1

    Map Reduce

      Map Operator Tree:

          TableScan

            alias: tbl_a

            Statistics: Num rows: 1343079 Data size: 694357252 Basic stats: COMPLETE Column stats: NONE

            Filter Operator

              predicate: ((url like '%XXXX%') and (param like '%XXXX%')) (type: boolean)

              Statistics: Num rows: 335769 Data size: 173588925 Basic stats: COMPLETE Column stats: NONE

              Select Operator

                expressions: col_1 (type: string), col_2 (type: string), col_3 (type: string), col_4 (type: string), col_5 (type: string), col_6 (type: string), col_7 (type: string), col_8 (type: string), col_9 (type: string), col_10 (type: string), '20200114' (type: string)

                outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10

                Statistics: Num rows: 335769 Data size: 173588925 Basic stats: COMPLETE Column stats: NONE

                File Output Operator

                  compressed: false

                  Statistics: Num rows: 335769 Data size: 173588925 Basic stats: COMPLETE Column stats: NONE

                  table:

                      input format: org.apache.hadoop.mapred.SequenceFileInputFormat

                      output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

                      serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

 

  Stage: Stage-0

    Fetch Operator

      limit: -1

      Processor Tree:

        ListSink

 

Time taken: 2.517 seconds, Fetched: 32 row(s)

hive>

 

 

 

2020-01-16 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석,  Hive, 쿼리 실행계획, Hive 쿼리, Hive Query execution plan

'SW Engineering > Hadoop' 카테고리의 다른 글

Hive 파일 Merge  (0) 2020.02.04
Hive 통계 정보  (0) 2020.01.29
YARN Node Labels (노드 레이블)  (0) 2020.01.16
YARN 메모리 설정  (0) 2020.01.14
YARN 스케줄러 – Capacity 스케줄러  (0) 2020.01.10

YARN Node Labels (노드 레이블)

 

·       Version : Hadoop 3.0.0-cdh6.3.2

 

YARN Labels 서버를 특성에 맞게 구분하여 작업을 처리하게 하는 기능을 제공한다. 예를들어 클러스를 구축한 서버들의 하드웨어 사양이 다르다고 할때, IO 요청이 많은 작업은 SSD 빠른 디스크를 가지고 있는 서버에서 작업하고, 연산이 많은 작업은 CPU 코어가 높거나, GPU 파워를 사용할 있는 서버에서 작업을 처리하면 효율적이다. 하지만 기존의 클러스터 방식은 이러한 특징에 따른 처리를 구분할 없이, 여유가 있는 서버에서 작업을 처리하기 때문에 YARN Node Labels 사용하면 서버에 따라 작업을 구분할 있어 효율적이다.

 

YARN Node Labels 아래와 같은 특징을 가지고 있다.

·       하나의 노드는 하나의 파티션을 가질 있으며 기본값은 DEFAULT 파티션(Partition=””)이다.

·       클러스터는 여러 파티션(여러 노드)으로 구성할 있다.

·       스케줄러에서 사용자가 파티션이 사용할 있는 리소스의 양을 설정해야 한다.

·       노드 레이블로 지정되지 않는 큐는 기본 파티션을 사용한다.

·       큐에서 설정된 노드만 작업에 이용할 있으며, 노드에 대한 접근제어가 가능하다.

·       노드마다 사용할 있는 자원의 비율을 정하여 사용량 제어 가능하다.

 

YARN 노드의 파티션은 2종류가 있다.

·       Exclusive Partition : 클러스터의 자원에 여유가 있어도 지정한 파티션만 이용하여 작업을 처리

·       Non-Exclusive Partition : 클러스터에 여유가 있으면 Default 파티션을 이용하여 작업 처리

 

 

노드 레이블을 사용하기 위해서는 yarn-site.xml에서 설정할 있다.

<property>

    <name>yarn.node-labels.enabled</name>

    <value>true</value>

  </property>

  <property>

    <name>yarn.node-labels.fs-store.root-dir</name>

    <value>hdfs://namenode:port/path/to/store/node-labels/</value>

  </property>

 

 

아래 표는 캐퍼시터 스케줄러의 설정에 대한 정의를 설명한 것으로 capacity-scheduler.xml 파일에서 확인 있다.

설정

설명

yarn.scheduler.capacity.<queue-path>.capacity

DEFAULT 파티션에 속하는 노드에 액세스 수있는 큐의 백분율 설정. 부모의 직계 자녀에 대한 기본 용량의 합은 100

yarn.scheduler.capacity.<queue-path>.accessible-node-labels

"hbase, storm" 같이 관리자가 큐에서 레이블에 액세스 있고 쉼표로 구분하여 레이블을 지정. 큐가 레이블 hbase storm 액세스 있음을 의미함. 모든 큐는 레이블이없는 노드에 액세스 있으므로 사용자는 이를 지정하지 않아도 . 사용자가 필드를 지정하지 않으면 상위 필드에서 상속.

yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.capacity

<label> partition 속하는 노드에 액세스 수있는 큐의 백분율을 설정. 부모 아래의 직계 자녀에 대한 <label> 용량의 합계는 100. 기본적으로 0.

yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.maximum-capacity

yarn.scheduler.capacity.<queue-path>.maximum-capacity 유사하게 대기열의 레이블에 대한 최대 용량. 기본적으로 100.

yarn.scheduler.capacity.<queue-path>.default-node-label-expression

"hbase" 같은 . , 응용 프로그램이 자원 요청에 노드 레이블을 지정하지 않고 큐에 제출 경우 "hbase" default-node-label-expression으로 사용.

 

 

[참고자료]

·       https://wikidocs.net/54964

·       https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/NodeLabel.html

·       https://developer.ibm.com/hadoop/2017/03/10/yarn-node-labels/

 

2020-01-15 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, YARN, YARN Node Labels, 노드 레이블, yarn-site.xml

YARN 메모리 설정

 

·       Version : Hadoop 3.0.0-cdh6.3.2

 

YARN 메모리 설정은 yarn-site.xml 파일에서 변경할 있으며, 노드 매니저의 메모리, CPU 개수와 컨테이너에 있는 최대, 최소 메모리 등을 설정할 있다. 기본값은 yarn-default.xml 참고하면 된다.

yarn.nodemanager.resource.memory-mb

·       클러스터의 노드에서 컨테이너 운영에 설정할 있는 메모리의 총량

·       메모리 최대값 설정시 노드의 OS 운영할 메모리(최소4G) 제외하고 설정

 

yarn.nodemanager.resource.cpu-vcores

·       클러스터의 노드에서 컨테이너 운영에 설정할 있는 CPU 개수

 

yarn.scheduler.maximum-allocation-mb

·       하나의 컨테이너에 할당할 있는 메모리의 최대값

·       기본 = 8GB

 

yarn.scheduler.minimum-allocation-mb

·       하나의 컨테이너에 할당할 있는 메모리의 최소값

·       기본값 = 1GB

 

yarn.nodemanager.vmem-pmem-ratio

·       실제 메모리 대비 가상 메모리 사용 비율

·       mapreduce.map.memory.mb * 설정값의 비율로 사용 가능

·       메모리를 1G 설정하고, 값을 10으로 설정하면 가상메모리를 10G 사용

 

yarn.nodemanager.vmem-check-enabled

·       값이 True 경우 가상 메모리 사용량을 확인하여 메모리 사용량을 초과하면  컨테이너 종료

 

yarn.nodemanager.pmem-check-enabled

·       값이 Ture 경우 물리 메모리 사용량을 확인하여 메모리 사용량을 초과하면 컨테이너 종료

 

 

 

 

2020-01-13 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, YARN, YARN MEMORY, 얀메모리 설정, yarn-site.xml

YARN 스케줄러 – Capacity 스케줄러

 

·       Version : Hadoop 3.0.0-cdh6.3.2

 

리소스 매니저는 클러스터 자원을 관리하고 애플리케이션 마스터의 요청을 받아서 자원을 할당한다. 자원 할당 정책을 스케줄러라고 하며, Hadoop 2 기본 스케줄러는 Capacity 스케줄러 이다. Capacity 스케줄러는 트리 형태로 큐를 선언하고, 별로 이용할 있는 자원의 용량을 할당하여 사용할 있다. 예를들어 100GB 클러스터 메모리 환경에서  A, B 두개의 큐에 40%, 60% 용량(capacity) 설정하면 A큐는 40G, B큐는 60G 메모리를 사용할 있다.

 

 

그림 출처 : https://www.oreilly.com/library/view/hadoop-the-definitive/9781491901687/ch04.html

 

아래표는 캐퍼시티 스케줄러의 주요 설정 항목 설명이다. 설정 파일은 capacity-scheduler.xml이다.

설정 항목

설명

yarn.scheduler.capacity.maximum-applications

PRE, RUNNIG 상태로 설정 있는 최대 애플리케이션의

yarn.scheduler.capacity.maximum-am-resource-percent

애플리케이션 마스터(AM) 할당 가능한 최대 비율. AM 워커를 관리하는 역활을 하기 때문에 워커에 많은 컨테이너를 할당하기 위해서는   값을 적당히 조절해야

yarn.scheduler.capacity.root.queues

Root 큐의 이름. root큐는 하위에 동록할 큐를 위해 논리적으로만 존재

yarn.scheduler.capacity.root.[큐이름].maximum-am-resource-percent

큐에서 AM 사용할 있는 자원의 비율

yarn.scheduler.capacity.root.[큐이름].capacity

큐의 용량 비율

yarn.scheduler.capacity.root.[큐이름].user-limit-factor

큐에 설정된 용량 * limit-factor 만큼 다른 큐의 용량을 사용할 있음. maxmimum-capacity 이상으로는 이용할 없음.

yarn.scheduler.capacity.root.[큐이름].maximum-capacity

큐가 최대로 사용할 있는 용량

 

설정된 큐의 목록과 현재 사용중인 용량을 확인하는 명령어는 아래와 같다.

mapred queue -list

 

 

 

운영중 스커줄러를 변경할 때에는 capacity-scheduler.xml 파일을 수정하고 아래 명령을 사용하여 설정을 변경할 있다. capacity, user-limit-factor, maximum-capacity 수정, root 신규 추가는 가능하지만, 큐의 삭제, 하위 추가는 오류가 발생하기 때문에 리소스 매니저를 리스타트 해야 한다.

yarn rmadmin -refreshQueues

 

스케줄러 설정시 애플리케이션 마스터에 할당되는 비율을 너무 높게 설정하면 컨테이너를 생성할 자원이 부족하기 때문에 작업의 종류에 따라 적정한 비율을 찾는것이 중요하다.

 

 

2020-01-09 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, YARN, 스케줄러, YARN Capacity, 캐퍼시티 스케줄러

임시 데이터 처리를 위한 매퍼 환경 설정 셔플 환경 설정

 

·       Version : Hadoop 3.0.0-cdh6.3.2

 

매퍼(Mapper) 처리중에 발생하는 임시 데이터의 처리를 위한 환경 설정 변수에 대해서 알아본다.

·       mapreduce.task.io.sort.mb  : 맵의 출력 데이터를 저장할 링버퍼의 메모리 크기. 맵의 처리 결과를 설정한 메모리 크기만큼 저장하고 있다가, io.sort.spill.percent 이상에 도달하면 임시 파일로 출력

ü  split/sort 작업을 위한 예약 메모리

ü  매퍼가 소팅에 사용하는 버퍼 사이즈를 설정

ü  디스크에 쓰는 횟수가 줄어듬

·       mapreduce.map.sort.spill.percent : 맵의 출력데이터를 저장하는 버퍼(mapreduce.task.io.sort.mb) 설정한 비율에 도달하면 로컬 디스크에 임시 파일 출력

·       mapreduce.task.io.sort.factor : 하나의 정렬된 출력 파일로 병합하기 위한 임시 파일의 개수

·       mapreduce.cluster.local.dir : 임시 파일이 저장되는 위치

 

셔플 단계의 설정은 맵에서 전달 받은 임시데이터를 복사하는 메모리와 데이터를 복사하는 스레드 개수 등을 설정 있다.

·       mapreduce.reduce.shuffle.parallelcopies : 셔플 단계에서 맵의 결과를 리듀서로 전달하는 스레드의 개수

·       mapreduce.reduce.memory.total.bytes : 셔플 단계에서 전달된 맵의 데이터를 복사하는 메모리 버퍼의 크기. (기본값 :1024MB)

·       mapreduce.reduce.shuffle.input.buffer.percent : 파일로 저장하기 위한 메모리 임계치 비율.

ü  mapreduce.reduce.memory.total.bytes *mapreduce.reduce.shuffle.input.buffer.percent 사이즈를 초과하면 파일로 저장.

ü  기본값은 0.7

·       mapreduce.reduce.shuffle.memory.limit.percent :  메모리 버퍼의 크기에 비해 파일의 비율이 설정을 넘어서면 바로 디스크에 기록.

ü  mapreduce.reduce.memory.total.bytes * mapreduce.reduce.shuffle.memory.limit.percent 크기를 넘어서면 파일로 저장.

ü  기본값은 0.25

 

Input 파일 용량에 따라 매퍼, 리듀서 개수 설정할 있다.

·       mapreduce.input.fileinputformat.split.maxsize :

ü  매퍼에 입력가능한 최대 사이즈

ü  처리하려고 하는 size/mapreduce.input.fileinputformat.split.maxsize = 매퍼 개수

·       mapreduce.input.fileinputformat.split.minsize : 매퍼에 입력가능한 최소 사이즈

 

입력 값에 상관없이 매퍼, 리듀서 개수 설정할 있다. 하둡 문서에 따르면 매퍼의 개수는 하둡이 계산한 매퍼의 개수 이하로는 설정할 없다고 한다. 예를들면 하둡이 매퍼의 개수를 500개로 계산했는데, 사용자가 매퍼의 개수를 100으로 설정하면 500개로 처리된다.

·       mapreduce.job.maps : 매퍼의 개수 설정

·       mapreduce.job.reduces : 리듀서 개수 설정

 

 

 

[참고자료]

·       https://cwiki.apache.org/confluence/display/HADOOP2/HowManyMapsAndReduces

·       https://wikidocs.net/23575

 

 

 

2020-01-07 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, MapReduce, 매퍼 환경 설정, 셔플 환경 설정, 매퍼, 리듀서 스레드 개수 설정.

MapReduce 메모리 설정

 

·       Version : Hadoop 3.0.0-cdh6.3.2

 

맵리듀스의 메모리 항목에 대한 정의를 알아본다. 맵리듀스의 메모리 설정은 mapred-site.xml, yarn-site.xml 값을 변경하여 사용할 있다.

 

[yarn-site.xml]

·       yarn.nodemanager.resource.memory-mb : 노드 매니저가 컨테이너 할당에 사용할 있는 메모리 사이즈

·       yarn.scheduler.minimum-allocation-vcores : 컨테이너에 할당 있는 최소 Vcore 개수

·       yarn-scheduler.maximum-allocation-vcore : 컨테이너에 할당 있는 최대 Vcore 개수

·       yarn.scheduler.minimum-allocation-mb : 컨테이너에 할당 있는 최소 memory 용량

·       yarn.scheduler.maximum-allocation-mb : 컨테이너에 할당 있는 최대 memory 용량

·       yarn.scheduler.increment-allocation-vcores : 컨테이너에 추가 할당 있는 Vcore

·       yarn.scheduler.increment-allocation-mb : 컨테이너에 추가 할당 memory 용량

 

[mapred-site.xml]

·       yarn.app.mapreduce.am.resource.cpu-vcores : Application Master 할당 하는 Vcore 개수

·       yarn.app.mapreduce.am.resource.mb : Application Master 할당 하는 memory 용량

·       mapreduce.map.cpu.vcores : Map 작업에 사용하는 Vcore 개수. 기본값 1.

·       mapreduce.map.memory.mb : Map 작업(컨테이너 생성시) 사용하는 memory 용량

·       mapreduce.map.java.opts.max.heap : Mapper JAVA HEAP SIZE. Xmx 옵션을 이용하여 사이즈를 설정. 컨테이너 메모리(mapreduce.map.memory.mb) 80% 설정.

·       mapreduce.reduce.cpu.vcores : Reduce 작업에 사용하는 Vcore 개수.  

·       mapreduce.reduce.memory.mb :  Reduce 작업에 사용하는 memory 용량. 컨테이너 메모리(mapreduce.map.memory.mb) 2배로 설정하는 것이 일반적.

·       mapreduce.reduce.java.opts : Reducer JAVA HEAP SIZE. Xmx 옵션을 이용하여 힙사이즈를 설정. 리듀스 컨테이너 메모리의 80% 설정.

·       mapreduce.task.io.sort.mb : Split/Sort 작업을 위한 예약 메모리

·       mapred.child.java.opts : 맵과 리듀스 태스크의 JVM 실행 옵션, Heap 사이즈 설정. mapreduce.map.java.opts, mapreduce.reduce.java.opts 설정이 설정을 오버라이드 하여 설정. 기본 설정은 -Xmx200m.

 

[참고자료]

·       YARN & MRv2 리소스 설정 : https://megalohan.blogspot.com/2017/09/yarn-mrv2.html

·       맵리듀스 메모리 설정 : https://wikidocs.net/23575

 

 

2020-01-07 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, MapReduce, 맵리듀스, 하둡 메모리 설정, 맵리듀스 메모리 설정, mapred-site.xml, yarn-site.xml

Hive에서 콤마(,) 컬럼 구분 쿼테이션 내부의 콤마(“, , ”) 파싱 스킵하기

 

·       Version : Hadoop 3.0.0-cdh6.3.2

 

Hive 테이블에서 데이터를 로드할때, 특정 구분자를 이용해서 파싱하는 경우 파싱의 규칙을 미리 테이블을 생성할때 정의해야 한다. 아래 스크립트는 콤마(,) 컬럼을 구분하는 데이터에서 파싱을 하지 않아야 하는 콤마(,) 데이터는 더블 쿼테이션(“”)으로 감싸서 해당 문장이 파싱되지 않도록 하는 규칙이다.

 

예를 들어 아래와 같은 콤마로 구분된 텍스트 데이터가 있다고 , 컬럼 Col_1, Col_2, Col_3 파싱한다.

col_1,col_2,"col_3(a=3&b=40&c=NOTES&cid=1,10,33)"

 

create table tbl_a (

col_1 string

col_2 string

col_3 string

)

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ("separatorChar" = ",","quoteChar" = "\"")

 

이미 테이블이 생성되어 있는 경우에는 ALTER 구문으로 테이블의 속성을 변경할 있다.

ALTER TABLE tbl_a set SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ("separatorChar" = ",","quoteChar" = "\"")

 

 

 

2020-01-02 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, Hive, 하이브, 하이브 콤마 파싱, SERDE, SERDEPROPERTIES, 서데, 서데 속성, ROW FORAT, 컬럼 파싱

'SW Engineering > Hadoop' 카테고리의 다른 글

임시 데이터 처리를 위한 매퍼 환경 설정 및 셔플 환경 설정  (0) 2020.01.08
MapReduce 메모리 설정  (0) 2020.01.07
MapReduce JobTracker  (0) 2019.12.31
MapReduce (맵리듀스)  (0) 2019.12.28
Hive Buckets (버켓)  (0) 2019.12.27

MapReduce JobTracker

 

·       Version : Hadoop 3.0.0-cdh6.3.2

 

하둡 V1 작업 단위는 (Job)이며, 하둡 V2 작업 단위는 애플리케이션(Application)이다. 잡은 (Mapper) 태스크와 리듀스(Reduce) 태크스로 나누어지며, 태스크는 어템프트(Attempt) 단위로 실행된다. 맵리듀스 Job들은 JobTracker라는 소프트웨어 데몬의 의해 제어된다. JobTracker들은 마스터 노드에 존재하면서 아래와 같은 역할을 수행한다.

·       클라이언트는 맵리듀스 잡을 JobTracker에게 보낸다.

·       JobTracker 클러스터의 다른 노드들에게 맵과 리듀스 태스크를 할당한다.

·       노드들은 TaskTracker라는 소프트웨어 데몬에 의해 각각 실행된다.

·       TaskTracker 실제로 또는 리듀스  태스크를 인스턴트화하고, 진행 상황을 Job Tracker에게 보고할 책임이 있다.

 

Task Attempt 태스크를 실행하기 위한 특정 인스턴스를 의미하는데, 적어도 하나 이상의 태스크가 존재하기 때문에 많은 Task attempt 있을것이다. 만약 Task attempt 실패하면, JobTracker에서 설정된 횟수만큼 Task attempt 실행한다.  반복후에도 오류가 발생하면 작업을 종료한다.

 

하둡 잡이 실행되면 아이디가 job_xxx_xxx 생성된다. 아이디로 잡의 상태, 로그를 확인할 있다. YARN에서는 application_xxx_xxx 확인할 있다. Job에서 생성되는 맵태스크의 아이디는 attempt_xxx_xxx_m_000000_00 이며,리듀스태스크의 아이디는 attempt_xxx_xxx_r_000000_00으로 생성된다.중간 아이디로   태스크(m) 리듀스 태스크(r) 구분한다.

 

 

 

2019-12-30 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, MapReduce, JobTracker, 태스크, 리듀스 태스크, 잡트래커, JobTracker in Hadoop

MapReduce (맵리듀스)

 

·       Version : Hadoop 3.0.0-cdh6.3.2,

 

맵리듀스는 간단한 단위 작업을 반복하여 처리할때 사용하는 프로그래밍 모델이다. 간단한 작업을 처리하는 (Map) 작업과 작업의 결과물을 모아서 집계하는 리듀스(Reduce) 단계로 구성된다.

 

하둡에서 분산처리를 담당하는 리듀스 작업은 맵과 리듀스로 나누어져 처리된다. 맵리듀스 작업은 병렬로 처리가 가능하며 여러 컴퓨터에서 동시에 작업을 처리하여 속도를 높일 있다. 맵리듀스가 분산, 병렬처리하기 좋은 이유는 입력 데이터에 대한 함수는 동시에 독립적으로 병영 처리할 있는 구조이기 때문이다. 아래는 맵리듀스 처리 순서이다.

 

1.       분할(Splitting) : 입력한 파일 값을 라인 단위로 분할한다.

2.       매핑(Mapping) : 분할된 라인 단위 문장을 (Map)함수로 전달하면 맵함수는 공백을 기준으로 문자를 분리, 단어 개수를 확인한다.

3.       셔플링(Shuffling) : 메모리에 저장되어 있는 함수의 출력 데이터를 파티셔닝과 정렬하여 로컬 디스크에 저장, 네트워크를 통해서 리듀서의 입력 데이터로 전달한다.

4.       리듀싱(Reducing) : 단어 목록들을 반복적으로 수행하고 합을 계산하여 표시한다.

 

맵리듀스의 장단점

단점

장점

·       고정된 단일 데이터 흐름

·       기본 DBMS 보다 불편한 스키마

·       단순한 스케줄링

·       상대적으로 낮은 성능

·       개발도구의 불편함

·       오픈소스 기술지원 한계

·       단순하고 사용이 편리

·       특정 데이터모델이나 스키마, 질의에 의존적이지 않은 높은 유연성

·       저장 구조의 독립성

·       데이터복제에 기반한 내구성과 내고장성 확보

·       높은 확장성

 

 

 

2019-12-27 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, MapReduce, 맵리듀스, Map, Reduce

Hive Buckets (버켓)

 

·       Version : Hadoop 3.0.0-cdh6.3.2, Hive

 

하이브는 쿼리 성능을 높이기 위해 버켓(Buckets)이라는 데이터 모델을 제공하며, 버켓은 지정된 칼럼의 값을 해쉬 처리하고 지정한 수의 파일로 나누어 저장한다. 조인에 사용되는 키로 버켓 컬럼을 생성하면 필요한 버켓만 조회하면 되기 때문에 전제 디렉터리를 풀스캔하는 것보다 훨씬 빠르게 처리할 있다.

파티션은 데이터를 디렉터리로 나누어 저장하는 방식이며 버켓은 데이터를 파일별로 나누어 저장한다. 아래 그림은 파티션과 버켓의 차이점을 쉽게 정의하고 있다.

 

 아래 스크립트는 버켓 테이블을 생성한다.

-- col2 버켓팅하여 20개의 파일에 저장

CREATE TABLE tbl1(

       col1 STRING,

       col2 STRING

)

CLUSTERED BY (col2) INTO 20 BUCKETS

LOCATION '/user/data/'

 

-- col2 버켓팅 하고, col1 기준으로 정렬

CREATE TABLE tbl2(

       col1 STRING,

       col2 STRING

)

CLUSTERED BY (col2) SORTED BY (col1) INTO 20 BUCKETS

LOCATION '/user/data/'

 

 

 

[참고자료]

https://data-flair.training/blogs/hive-partitioning-vs-bucketing/

 

 

 

2019-12-26 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, hive, 하이브, hive buckets, 하이브 버켓

'SW Engineering > Hadoop' 카테고리의 다른 글

MapReduce JobTracker  (0) 2019.12.31
MapReduce (맵리듀스)  (0) 2019.12.28
Hive Skewed (스큐)  (0) 2019.12.24
Hive Partition 생성,수정,복구  (0) 2019.12.21
Hive Meta Database  (0) 2019.12.19

Hive Skewed (스큐)

 

·       Version : Hadoop 3.0.0-cdh6.3.2, Hive

 

스큐(skewed) 사전적 의미는 비스듬하다라는 뜻으로, 특정 데이터가 많이 입력되는 경우, 데이터 파일 한쪽에만 너무 많은 데이터가 쌓이는 것을 의미한다. 하이브에서 스큐 테이블로 생성하면 따로 파일을 만들어서 사용하므로 성능상 이점이 있다. 스큐는 파티션과 유사하지만 용도가 조금 다르다. 파티션은 크게 데이터를 분류하는 용도로 사용되며, 스큐는 컬럼의 데이터를 구분할 사용된다.

 

하이브 매뉴얼에는 아래와 같은 내용이 있다. 스큐 테이블은 스큐의 정보를 저장하고, 리스트 버켓팅까지 추가하면 스큐된  서브 디렉터리를 생성한다.

Skewed Table vs. List Bucketing Table

·       Skewed Table is a table which has skewed information.

·       List Bucketing Table is a skewed table. In addition, it tells Hive to use the list bucketing feature on the skewed table: create sub-directories for skewed values.

 

 

예를 들어, col_1이라는 컬럼에 1 ~ 1000 숫자 사이의 데이터가 입력된다고 할때, 파티션은 1000개가 생성된다. 그런데 대부분의 데이터가 1, 2라고 가정한다면 스큐는 1, 2 데이터 파일과 나머지 3개의 디렉토리로 나누어서 파일로 구별하여 저장한다. 이렇게 스큐를 사용하여 파일 갯수를 줄이면 네임노드의 관리포인트가 줄어들어 네임노드의 성능 관리에 효율적이다. 실제 데이터를 조인할 경우에도 많은 성능 이점이 있다.

 

아래 스크립트는 스큐 테이블을 생성한다. STORED AS DIRECTORIES 옵션을 사용하지 않으면 디렉토리 구분없이 파일로 따로 저장한다.

-- col2 입력 값중 1 들어오는 값만 스큐로 저장

CREATE TABLE tbl_skewed (

col_1 STRING,

col_2 STRING

) SKEWED BY (col2) ON ('1')

STORED AS DIRECTORIES

LOCATION '/user/tbl_skewed/';

 

 

 

 

2019-12-23 / Sungwook Kang / http://sungwookkang.com

 

Hadoop, hive, 하이브, hive skewed, 하이브 스큐

'SW Engineering > Hadoop' 카테고리의 다른 글

MapReduce (맵리듀스)  (0) 2019.12.28
Hive Buckets (버켓)  (0) 2019.12.27
Hive Partition 생성,수정,복구  (0) 2019.12.21
Hive Meta Database  (0) 2019.12.19
Hive Meta Store 설정  (0) 2019.12.18

+ Recent posts