본문 바로가기
프로그래밍/hive

Hive 성능 향상 방안

by W.C. 2016. 8. 18.
728x90

일반적으로 알려진 Hive 성능을 높이기 위한 방안 알려진 방안 HDP를 사용할 경우

[Tez Engine 사용] (현재 사용중)

MR(Map Reduce)는 여전히 대용량 배치 작업에 사용되고 있지만 이제 구 시대의 기술이 되어 버렸죠. Tez 엔진을 사용하면 2배 이상의 성능 향상이 가능 함


[ORC File  사용] (현재 사용중)

일반적인 TEXT FILE 형태로 HIVE Table에 데이터를 넣는 것 보다 ORC File 형태로 입력하면 좀더 나은 성능을 얻을 수 있다. 일반적으로 Hive Table을 생성 할때

“CREATE TABLE TESTTABLE (value string, key string) STORED AS ORC” 만들고

“insert OR Load Data”를 사용하여 TABLE에 입력하면 된다.

추가적으로 SNAPPY 압축을 걸어 줄 수 있다.

“CREATE TABLE TESTTABLE (value string, key string) STORED AS ORC TBLPROPERTIES (“orc.compress”=”SNAPPY”)”

ORC 파일 형태의 파일이 TEXT 파일 형태보다 용량을 1/4정도 절감 할 수 있습니다. 여기에 SNAPPY 압축으로 데이터 용량을 더 줄이는 것이 가능 하다


[VECTORIZATION 사용] (현재 사용중)

Hive Configuration에 존재 하는 항목 이다.

hive.vectorized.execution.enabled = true

hive.vectorized.execution.reduce.enabled = true

위와 같이 설정하면 VECTORIZATION을 사용 가능 하다

VECTORIZATION은 ‘like’ scan, aggregations, fliters and joins의 성능 향상을 가져 온다


[PARTITION 사용] (현재 미사용)

PARTITION은 특정 키를 기준으로 HDFS에 저장되는 파일의 위치를 분리 한다.

QUERY 수행 시 PARTITION KEY를 Filter 조건으로 걸어 주면 해당 지역의 파일만 스캔하여 분석을 하기 때문에 빠른 응답 속도를 보인다.

하지만 FULL SCAN QUERY의 경우 속도 저하가 발생합니다.

그리고 PARTITON으로 분할 입력 시 HDFS내에 파일 내에 개수가 증가하게 될 경우 작은 용량의 파일의 개수가 증가하면서 FILE I/O 부하가 증가하여 전체적인 속도 저하가 크게 발생하게 된다.

지금까지 PARTITON을 사용 하는 것 보다 FULL SCAN QUERY를 사용 하는 것이 더 빠른 양의 데이터(ㅡㅡ)였기에 사용하지 않고 있었지만 데이터의 증가가 빠르게 이루어 지고 있는 만큼 적용 후 테스트를  더 진행해 봐야 할 것 같다.


[COST BASED QUERY OPTIMIZATION 사용] 

QUERY 수행 PLAN을 최적화 하여 사여 EXCUETION 하도록 하는 기능 이다.

Configuration

hive.cbo.enable=true

hive.compute.query.using.stats=true

hive.stats.fetch.column.stat=true

hive.stats.fetch.partition.stat=true

위 설정으로 사용 가능 하며 현재 설정되어 있는 옵션

분석을 원하는 Table 에

analyze table [tablename] compute statistics

analyze table [tablename] compute for columns;

명령어를 하면 각 컬럼에 대한 통계 데이터를 생성하여 최적의 쿼리 PLAN을 찾아 준다고 한다.


[쿼리 최적화] 

가장 중요한 것은 쿼리 최적화 이다. 쿼리를 작성 할 때 나도 가끔 잊곤 하는 것이 있는데..

항상 explain 으로 쿼리 plan을 확인 하는 습관이 필요 하다.

아무리 최적화를 한다고 해도 쿼리를 잘 못 짜면 아무 소용이 없다.

UDF Function 도 마찬가지…



[간단한 테스트]

CBO

TABLE을 분석 하기 전

select pid , count(*) from poiranklogtable_orc group by pid limit 1000

QUERY의 execute plan 이다.

눈여겨 볼 것은 맨 위 상단의

Plan not optimized by CBO

Reducer 2 Vectorized

Map 1 vectorized

이다. 위에서 언급 했던 vectorization이 적용 되어 있다고 하고 CBO로 최적 화 되지 않았다고 나온다.

쿼리 수행 시간 : 60.429

“analyze table poiranklogtable_orc compute statistics for columns” 실행 후

CBO_after

겉으로 보기에는 별 차이가 없어 보인다.

상단에 Plan not optimized by CBO 도 그대로 보인다.

Statistics:Num rows: 4366386 Data size: 39956388 Basic stats: COMPLETE Column stats: COMPLETE

자세히 살펴보면 위와 같이 group by operator 에서 Data Size와 Num Rows의 개수가 줄었다.

쿼리 수행 시간 : 47.33

CBO 를 사용하기 위해서 analyze 명령을 수행해야 하는데 이 수행 명령 또한 소요 시간이 발생한다. (위의 Table에서는 소요 시간 32초 즉 전체 수행 시간: 32+47 = 79)

그냥 analyze를 사용한다고 해서 optimized 하게 모든 plan이 다 적용 되는 것도 아닌 것 같다. 데이터가 적재 될 때 마다 분석 쿼리를 수행해야하는 지도 불분명 하다.

CBO기능은 좀더 확인을 해봐야 할 듯 하다.

'프로그래밍 > hive' 카테고리의 다른 글

Hive MIN/MAX STRUCT 쿼리 사용  (0) 2017.12.25
Hive CLI 기본 셋팅  (0) 2017.12.25
Hive Command Line CLI History 보기  (0) 2016.06.07
Hive GenericUDTF 사용  (0) 2016.05.13
HDP Hiveserver2 JAVA heap Error  (0) 2016.03.30