View
Hive LLAP 사이징 및 설정
1. 기본 클러스터 설정
1) LLAP 를 수행할 YARN 노드를 설정하라.
사용자 요구 및 사용하는 작업workload에 따라서 일반적으로 클러스터의 15~50%의 노드를 LLAP로 사용하거나, 전체 클러스터를 LLAP 노드로 설정할 수 있다.
Hive LLAP를 수행하기 위한 3가지 YARN container 종류가 있다.
- 데이터를 직접 처리하는 execution daemon
- 쿼리 수행을 관리하기 위한 쿼리 코디네이터, TEZ AMs
- execution daemon을 모니터링 하고 AM을 실행하기 위한 Slider
LLAP에 할당된 용량의 대부분이 execution daemon에 의해서 사용된다.
최적의 결과를 위해서 YARN 노드 전체가 execution daemon 을 할당해야 하기 때문에, 클러스터의 어떠한 노드가 LLAP를 위해서 사용될 것인지 결정하는 단계가 필요하다.
2) 쿼리 코디네이터(=TEZ AMs) 의 개수 설정으로 쿼리 병렬성을 결정하라.
일반적으로 BI 도구를 사용할 때 동시에 수행될 쿼리의 수(병렬성)는 전체 사용자의 수보다 작게 설정한다.
- 전체 사용자가 한번에 쿼리를 수행하지는다.
- 작게 설정 하는 것이 캐쉬 효용성이 좋다.
TEZ AM 개수
- = 동시에 수행할 쿼리 수 + 고정 상수값(일부 노드가 일시적으로 사용 불가능한 경우를 고려)
- 예) 동시에 9개의 쿼리를 수행하고자 한다면, 10개의 TEZ AM이 필요하다.
3) LLAP 데몬 구성 방식 및 메모리를 설정해라.
LLAP 데몬을 구성하는 방식은 2가지 이다.
LLAP daemon 전용 NodeManager를 주고 해당 노드에서는 LLAP daemon 만을 수행한다.
장점 : 빠르다. LLAP 아닌 작업들과 간섭이 없다.
단점 : non-LLAP NM을 3개 이상 설정해야 한다. (TEZ AM에 대한 병목이 생길 수 있다)
LLAP daemon 크기 = NM 메모리 , AM Size(2GB) * AM 개수 , Slider AM(1GB)
전체 NodeManager에 쿼리 코디네이터 및 Slider를 LLAP daemon와 함께 구성한다.
장점 : LLAP 작업이 쿼리 코디네이터 부족으로 인해 병목이 생기지 않는다.
단점 : NM 당 LLAP daemon의 메모리 사이즈가 줄어든다.
LLAP daemon 크기 = NM 메모리 - AM size(2GB) * 노드 당 AM 개수 - slider size(1GB)
위는 LLAP 쿼리 및 non-LLAP 쿼리가 동시에 사용될 때 고려해야 할 사항이며, 모든 쿼리가 LLAP로 동작하는 경우 클러스터 환경에 맞게 최적의 구성을 해야 한다. (ex. NM 사양에 따라 다름)
3) YARN / LLAP 스케쥴러 큐를 설정해라.
YARN preemption 이 반드시 enabled 되어 있어야 한다.
yarn.scheduler.capacity.ordering-policy.priority-utillization.underutillized-preemption.enabled=true
만약 execution daemon을 위한 충분한 메모리가 있는 더라도, 모든 메모리를 노드를 LLAP에 할당하면서 yarn 작업에 충분한 메모리가 할당되지 않을 수도 있다. Preemption은 Yarn이 메모리를 확보한 후에 LLAP를 수행할 수 있도록 보장해 준다.
LLAP 전용 NM을 사용하는 경우 YARN 메모리 설정 설정
YARN 컨테이너 메모리 사이즈의 최소값은 반드시 1024MB 로 설정하고, 최대 값은 NM(node manager)가 사용할 수 있는 총 메모리로 설정한다.
yarn.nodemanager.resource.memory-mb = yarn.scheduler.maximum-allocation-mb
yarn.scheduler.minimum-allocation-mb = 1024
LLAP + tez + slider 의 NM을 사용하는 경우 YARN 메모리 설정 설정
- 큐 전체 크기 = (총 tez 개수 * 2GB) + (slider AM 1GB) + (LLAP daemon size * 노드 개수)
- LLAP 큐를 다른 YARN 큐보다 더 높은 우선순위로 설정해야 한다.
- LLAP 큐의 최대/최소 용량capacity를 동일하게 full capacity로 설정해라.
- 큐의 사용자 제한을 따로 설정하지 마라.
4) LLAP daemon CPU 설정 및 memory 설정
LLAP daemon 메모리 설정과 관련된 항목은 아래와 같이 3개로 구성되어 있다.
Total memory : 위에서 설정한 컨테이너 사이즈
Xmx : executor 들에 의해서 사용되는 메모리와 약간의 오버헤드
Off-heap 캐쉬 메모리
전체 메모리(Total memory) = off-heap 캐시 메모리 + Xmx + JVM 오버헤드
Xmx 에 있는 오버헤드는 LLAP 내부적으로 계산되기 때문에, 계산에서 무시될 수 있다.
일반적인 경우 아래와 같은 기준을 따른다. 하지만 환경에 따라서 아래 설정을 변경 할 수 있다.
- 하나의 core에 하나의 executor 가 수행될 수 있도록 해서 병렬성을 최대로 해라.
- executor 당 최소 4GB의 메모리를 갖도록 하여라. 작은 메모리가 더 적합한 경우가 있지만, OOM과 같은 메모리 문제가 발생할 수 있음으로 충분한 메모리를 할당해야 한다.
- IO layer 를 enable 시켜라. 이것은 어느정도의 캐시 메모리를 필요하는데, 캐쉬 메모리가 많을 수록 워크로드에 유용하다. 특히 cloud 기반의 F/S에서 BI 성 쿼리를 사용할때 유용하다.
- 결과적으로, executor 수, cache size 그리고 executor 당 메모리 크기 3개가 균형이 맞아야 한다.
노드당 executor 수를 설정해라
노드의 core개수 만큼 설정해라.
Xmx 값과 executor 에서 필요한 최소 캐시 메모리를 설정해라
LLAP daemon은 Xmx 힙 메모리 대부분을 쿼리 작업을 처리하기 위해 사용된다. 공유 오버헤드shared overheads는 LLAP 내부적으로 계산된다. 그렇기 때문에 executor 메모리 기반으로 daemon의 Xmx 값을 설정해 주면 된다.
- Xmx 메모리 크기 = executor * executor 당 메모리(4GB)
LLAP executor 메모리는 group by 테이블, 정렬 버퍼, 셔플 버퍼, 해시테이블 맵조인, PTF 등을 위해서 사용된다. 일반적으로 충분한 메모리가 더 좋은 성능과, 더 효율적인 실행계획을 선택한다.
노드에 충분한 메모리가 존재하지 않는다면, 우선적으로 executor 수를 조절해야 한다. executor 수를 유지하기 위해서 executor 메모리를 4GB 보다 더 낮게 설정하는 것도 가능하지만 실제 수행할 workload를 가지고 충분히 테스트가 수행되어야 한다. 병렬성의 감소보다 메모리 부족으로 인한 성능저하가 더 크다.
추가적으로 IO layer 가 활성화 되어 있다면 관련 연산을 처리하기 위해 executor 당 200MB의 cache가 필요하다. 아래와 같이 전체 16개의 executor가 있다면 3.2 GB 정도의 cache 가 필요하다.
headroom과 cache 사이즈 설정
JVM 오버헤드 (GC 구조 등)를 위해서 daemon에 어느정도 메모리를 남겨 두어야 하고, container 에 약간의 여유를 두어 YARN에 의해서 종료되지 않도록 해야 한다. 이러한 여유공간을 headroom 이라고 하는데 headroom은 Xmx의 6% 정도로 설정하고 6GB가 넘지 않도록 한다. 이것은 직접적으로 설정하는 값이 아니고 container 메모리에 off-heap cache 사용할 것을 계산하여 설정해야 한다.
cache 크기를 설정하기 위해서 총 container 크기에서 headroom과 Xmx 를 가져와야 한다. 만약 cache 크기가 위에서 말한 수행 가능한 크기 아래라고 한다면 Xmx 값을 줄여서(일반적으로 executor 수를 줄임) 더 많은 메모리를 확보하거나, LLAP IO를 비활성화 (hive.llap.io.enabled = false) 해야 한다.
(예시)
Xmx 가 64 GB로 설정되어 있으면 headroom은 약 4GB (0.06 * 64 Gb)로 설정 가능하다.
cache size(24 GB) = 전체 데몬 메모리 (92GB) - Xmx(64GB) - headroom(4GB) 로 설정**할 수 있는데, 이것은 최소 값인 3.2 GB 보다 크기 때문에 문제가 없다.
Interactive query 설정
- Ambari Hive Configuration 패널에서 아래와 같이 Interactive 쿼리 설정을 할 수 있으며, 추가적인 고급설정 또한 수행할 수 있다.
Advanced config 에서 관심있게 볼 설정값은 아래와 같다.
tez.am.resource.memory.mb : hive AM 크기를 커스텀하게 변경함
2. 직접 메모리 산정해보기
클러스터 사양
Worker Node(Node Manager) : 7 대
CPU : 16 core
노드당 메모리 : 96 GB (서버 전체 메모리 112 GB)
workload : 모든 Hive 쿼리를 LLAP 를 통해서 처리하며 container only 작업은 없는 것으로 간주.
=> 전체 NodeManager에 쿼리 코디네이터 및 Slider를 LLAP daemon와 함께 구성
설정값
yarn 스케쥴러 큐 설정
yarn.scheduler.capacity.ordering-policy.priority-utillization.underutillized-preemption.enabled=true
min/max capacity = 90 %
ordering policy : Fair
priority = 1
Limit factor = 1
쿼리 병렬성 설정
Parameter Value Description tez.am.resource.memory.mb 4096 Tez AM 메모리
(작은경우 작업이 제대로 수행되지 않음 )slider_am_container_mb 1024 Slider AM 메모리 hive.server2.tez.sessions.per.default.queue 7 Tez AM 수 Yarn 컨테이너 설정
Parameter Value Description yarn.nodemanager.resource.memory-mb
yarn.scheduler.maximum-allocation-mb98304 컨테이너 최대 크기 yarn.scheduler.minimum-allocation-mb 1024 컨테이너 최소 크기 LLAP 설정
Parameters value Description num_llap_nodes 7 LLAP 데몬 노드 수 memory per daemon 93184 llap daemon 당 전체 메모리 (ambari-auto conf) hive.llap.daemon.num.executors
hive.llap.io.threadpool.size8 executor 개수(=core 개수)
ambari에서 12 이상 권고하지 않음hive.llap.io.enabled true IO layer 사용 여부 hive.llap.io.memory.mode cache 데이터/메타데이터 캐쉬 사용 llap_headroom_space 4096 headroom 크기(Xmx size * 0.06) In-memory cache per daemon 23552 executor 에서 사용할 cache 총 합
(ambari-auto conf)llap_daemon_heapsize 65536 LLap daemon heap size (executor 메모리 총합)
계산방법
Yarn nodemanager 메모리 크기 설정 : 96 GB
- yarn.nodemanager.resource.memory-mb
- yarn.scheduler.maximum-allocation-mb
- 서버 메모리의 약 80~90%
Yarn 최소 컨테이너 크기 설정 : 1 GB
- yarn.scheduler.minimum-allocation-mb
- 1 GB가 권고값. 메모리가 더 필요한 경우 1GB 단위로 추가 할당함
Tez AM 크기 설정 : 4 GB
- tez.am.resource.memory.mb
- 수행하는 쿼리에 및 데이터 량에 따라 조절 필요함
Tez AM 수 (동시성) : 7
- hive.server2.tez.sessions.per.default.queue
- Nodemanager 개수 이하로 설정
Slider AM 크기 설정 : 1GB
- slider_am_container_mb
LLAP 데몬 크기 설정 : 91 GB
- node manager 메모리 크기 - Tez AM 메모리(1개) - Slider AM 메모리 = 91 GB
- memory per daemon
Executor 수 설정 : 8
- executor 메모리를 고려하여 설정
- hive.llap.daemon.num.executors
- hive.llap.io.threadpool.size
LLAP Heap Size 크기 설정 : 64 GB
- executor 당 8GB 로 설정하여 할당 (8*8GB = 64 GB )
LLAP Headroom 크기 설정 : 4 GB
- LLAP heap 64GB * 0.06 = 약 4 GB
LLAP 인메모리 캐시 : 23 GB
- LLAP 데몬 크기 91GB - LLAP heap 크기 64 GB - LLAP headroom 크기 4GB = 23 GB
'02.IT공부(간헐적취미) > 빅데이터' 카테고리의 다른 글
[HDFS] Hadoop HDFS balancer수행 및 bandwidth변경 (0) | 2018.10.10 |
---|---|
[Hive] 파티션 종류 및 특징 (0) | 2018.08.28 |
[HBase] WAL(Write Ahead Log)를 이용한 region 복구 (0) | 2018.07.11 |
[Phoenix] Feature#2 - Secondary Indexing (2) (0) | 2018.05.27 |
[Phoenix] Feature#2 - Secondary Indexing (1) (0) | 2018.05.27 |