View

Hive LLAP 사이징 및 설정

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)

        LLAP only memsize

         

    • 전체 NodeManager에 쿼리 코디네이터 및 Slider를 LLAP daemon와 함께 구성한다.

      • 장점 : LLAP 작업이 쿼리 코디네이터 부족으로 인해 병목이 생기지 않는다.

      • 단점 : NM 당 LLAP daemon의 메모리 사이즈가 줄어든다.

      • LLAP daemon 크기 = NM 메모리 - AM size(2GB) * 노드 당 AM 개수 - slider size(1GB)

        LLAP + AM + Slider

         

  • 위는 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로 설정해라.
    • 큐의 사용자 제한을 따로 설정하지 마라. LLAP 스케쥴러 큐 설정

     

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

       

  • 쿼리 병렬성 설정

    ParameterValueDescription
    tez.am.resource.memory.mb4096Tez AM 메모리
    (작은경우 작업이 제대로 수행되지 않음 )
    slider_am_container_mb1024Slider AM 메모리
    hive.server2.tez.sessions.per.default.queue7Tez AM 수

     

  • Yarn 컨테이너 설정

    ParameterValueDescription
    yarn.nodemanager.resource.memory-mb
    yarn.scheduler.maximum-allocation-mb
    98304컨테이너 최대 크기
    yarn.scheduler.minimum-allocation-mb1024컨테이너 최소 크기

     

  • LLAP 설정

    ParametersvalueDescription
    num_llap_nodes7LLAP 데몬 노드 수
    memory per daemon93184llap daemon 당 전체 메모리 (ambari-auto conf)
    hive.llap.daemon.num.executors
    hive.llap.io.threadpool.size
    8executor 개수(=core 개수)
    ambari에서 12 이상 권고하지 않음
    hive.llap.io.enabledtrueIO layer 사용 여부
    hive.llap.io.memory.modecache데이터/메타데이터 캐쉬 사용
    llap_headroom_space4096headroom 크기(Xmx size * 0.06)
    In-memory cache per daemon23552executor 에서 사용할 cache 총 합
    (ambari-auto conf)
    llap_daemon_heapsize65536LLap 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

       


Share Link
reply
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31