데이터 엔지니어링/HIVE

[Hive]하이브 관련 튜닝 옵션 정리

안용감한호랑이 2023. 10. 24. 00:44

Hive 관련 업무를 진행하면서 지속적으로 찾게 되는 Hive관련 옵션들을 정리하였습니다.

아래 순서는 튜닝순서와는 전혀 관련이 없으며 Hive 배치들을 튜닝하며 사용한 옵션들을 메모해 놓은 것을 정리하였습니다.

 

혹시 틀린부분이 있다면 댓글로 정정부탁드립니다.

감사합니다.

 

 

  1.  Tez
    • SET hive.execution.engine=tez;
      • Hive query의 실행 엔진을 tez엔진으로 세팅한다.
      • mr엔진 혹은 spark로도 변경할 수 있으며 각각 옵션은 mr, spark이다. 
      • Hive 2.x 버전부터 default는 tez
    • SET tez.am.container.reuse.enabled=true;
      • tez 엔진이 동일한 컨테이너를 재사용하여 여러 쿼리를 실행할지 여부를 결정
      • 매개변수를 활성화 하면 모든 쿼리에 대해 컨테이너 리소스를 재할당하는 메모리 오버헤드를 방지하여 성능이 향상된다.
      • 다만 몇몇 쿼리에 대해 false가 오히려 메모리나 속도 측면에서 빠른 경우가 있다.
    • SET tez.am.resource.memory.mb=2048;
      • tez엔진이 사용할 메모리 설정
      • 무조건 2048이 아니라 서버, 데이터 상황에 맞게 조율
    • SET tez.am.resource.cpu.vcores=1;
      • cpu 사용량 설정
      • 서버, 데이터 상황에 맞게 조율
    • SET hive.tez.container.size=2048;
      • tez 컨테이너가 사용할 메모리 사이즈 지정
      • 데이터 입력사이즈에 맞게 적당한 크기의 메모리를 지정해야 한다.
    • SET tez.grouping.max-size=256000;
      • tez 엔진의 grouping 사이즈를 조절한다.
      • 컬럼 A로 파티셔닝 할 때 파티션당 60여 개의 ORC파일이 존재할 때 파일당 10~20kb인 경우 파일의 사이즈가 작아 매퍼가 작게 생성되지만 ORC파일의 특성상 하나의 파일에 많은 데이터가 들어가게 되고, 이 데이터를 모두 처리하는데 많은 메모리가 소모된다. 이러한 경우 grouping 사이즈를 조절하여 매퍼의 개수를 늘려 하나의 매퍼가 처리하는 데이터를 줄이면 속도가 상승한다.
  2.  Reducer
    • SET hive.exec.reducers.bytes.per.reducer=256000000;
      • 하나의 reducer당 256MB 사용
    • SET hive.exec.reducers.max=128;
      • Hive Job당 reducer 개수 제한

  3. Merge
    • SET hive.merge.smallfiles.avgsize= 200000000;
      • defualt : 16000000
      • 해당 값보다 작으면 병합
      • Hadoop 특성상 3-copy 혹은 그 이상 copy 정책을 가진다. 또한 파일 하나당 해당 파일에 대한 메타정보를 메모리에 저장하고 있기 때문에 다수의 작은 파일은 서버에 부하를 준다.
      • ORC 파일 특성상 작은 파일로 여러개 가지고 있는 것보다 큰 파일로 저장하는 게 이점이 더 많다.
    • SET hive.merge.size.per.task=256000000;
      • merge된 파일의 크기는 해당값으로 지정
    • SET hive.merge.mapfiles=true;
      • 맵퍼 단독작업인 경우 merge 한다.
    • SET hive.merge.mapredfile=true;
      • 맵리듀스 단독작업인 경우 merge 한다.
    • SET hive.merge.tezfiles=true;
      • 테즈 작업인 경우 merge 한다.
  4. Map join 
    • 맵조인은 조인할 테이블의 크기가 작아 메모리에 올릴 수 있다면 사용해 볼 수 있다.
    • SET hive.mapjoin.smalltable.filesize= 25600000;
      • 해당값보다 작은 테이블의 경우만 map join이 수행되기 때문에 해당 옵션의 조율 필요
    • SET hive.auto.convert.join=true;
      • 위 옵션이 true가 아니라면 map join은 수행되지 않는다.
    • SET hive.auto.convert.join.noconditionaltask=true;
      • 해당 옵션을 사용하면 더 이상 map join에 대한 힌트를 사용하지 않아도 된다.
      • hint : /*+ MAPJOIN(table_name) */
    • SET hive.auto.convert.join.noconditionaltask.size=25600000;
      • 메모리에 올릴 테이블의 기본 사이즈

  5. Vectorized
    • 벡터화 연산을 통해 CPU 사용률을 높여 처리속도를 높인다.
    • 검색, 필터, 집계, 조인에서 사용되며 한 번에 1024행을 처리한다. 
    • SET hive.vectorized.execution.enabled=true;
    • SET hive.vectorized.execution.reduce.enabled=true;
    • SET hive.vectorized.execution.reduce.groupby.enabled=true;
  6. CBO
    • Cost-Base Optimizer : 컬럼에 대한 통계량
    • SET hive.stats.fetch.column.stats=ture;
      • 새로 생성되는 테이블과 INSERT 처리를 할 때 자동으로 통계정보수집
    • SET hive.stats.fetch.column.stats=ture;
    • SET hive.stats.fetch.partition.stats=true;
    • ANALYZE TABLE <Table_Name> COMPUTE STATISTICS:
      • 수동으로 테이블에 대한 통계량을 계산한다.
    • ANALYZE TABLE <Table_Name> PARTITION(PARTITION_COLUMN_NAME="Partition_Name") COMPUTE STATISTICS FOR COLUMNS;
      • 수동으로 파티션에 대한 통계량을 계산한다.
    • EXPALIN으로 CBO 적용 여부를 확일할 수 있다.
      • Plan optimized by CBO라고 출력된다.
    • 적용 불가능 한 상황
      • 트랜스폼은 사용불가
      • 인라인 Lateral View Join만 가능
      • Unique 조인 불가
      • 서브쿼리 사용 불가
      • Having절에 SELECT의 alias가 들어있으면 사용 불가
      • SORT BY 사용 불가
  7. 압축 옵션
    • SET hive.exec.compress.output=true;
    • SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;

 

 

'데이터 엔지니어링 > HIVE' 카테고리의 다른 글

[Hive] 하이브 Query 주의 사항  (1) 2023.10.25
[Hive] Hive-맵리듀스(2)  (0) 2023.08.09
[Hive] Hive-Intro-(1)  (0) 2023.08.09
[Hive] Hive-시작-(0)  (1) 2023.08.08