본문 바로가기
빅데이터/hive

[hive] 하이브 성능 최적화 방안

by hs_seo 2017. 12. 26.

하이브의 성능 향상을 위한 방안은 다음과 같다. 


TEZ 엔진 사용

hive 의 기본엔진은 mr 이었으나 2.x로 넘어오면서 tez를 사용하게 되었다. 

mr 엔진은 맵리듀스 연산중 중간 파일을 로컬 디스크에 쓰면서 진행한다. 

이로 인한 IO 비용으로 늦어지게 되는데 tez 엔진은 이 임시 파일을 메모리에 저장하여 처리 속도를 높인다.


: 엔진 설정 및 큐 설정

set hive.execution.engine=tez;

set tez.queue.name=queue;


ORC 파일 사용

데이터 저장에 ORC 파일 포맷을 이용한다. 

ORC 파일 포맷은 데이터를 컬럼별로 저장하기 때문에 검색 속도와 압축률이 좋다. 


아래와 같이 CREATE 문에 STORED AS 구문을 추가하면 된다. 

압축방식도 프로퍼티를 이용하여 설정할 수 있다. 


CREATE TABLE table1(

    col1 STRING

STORED AS ORC

TBLPROPERTIES ("orc.compress"="SNAPPY");


Vectorization 사용

벡터화를 사용하면 한번에 1024개의 row 를 처리하여 처리속도를 높인다. 

filter, join, aggregation 처리의 속도를 높여 준다. 


: 벡터화 프로퍼티 설정

set hive.vectorized.execution.enabled=true;

set hive.vectorized.execution.reduce.enabled=true;



파티셔닝, 버켓팅 사용

데이터 검색에 사용되는 데이터를 줄이기 위한 방안으로 파티셔닝, 버켓팅 기능을 제공한다. 

파티셔닝은 데이터를 폴더 단위로 구분하여 저장하고,

버켓팅은 지정한 개수의 파일에 컬럼의 해쉬값을 기준으로 데이터를 저장한다. 


: 파티셔닝

CREATE TABLE table1(

    col1 STRING

PARTITIONED BY (yymmdd STRING);


: 버켓팅
CREATE TABLE table1(
    col1 STRING
CLUSTERED BY(user_id) INTO 256 BUCKETS;


CBO 사용

CBO를 이용하면 하이브 메타의 정보를 이용하여 쿼리의 성능을 향상시킨다. 

count, sum 같은 집계함수는 CBO를 이용하여 맵리듀스 연산없이 바로 결과를 확인할 수 도 있다. 


set hive.cbo.enable=true;

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

set hive.stats.fetch.column.stats=true;

set hive.stats.fetch.partition.stats=true;




반응형