2020년 9월 28일 월요일

Apache Hive [1] - 하이브 쿼리 퍼포먼스(속도)를 높이는 방법


[ 1. Tez Engine을 사용 ]

Apache Tez는 데이터 처리 작업의 복합 비순환 방향 그래프(DAG)를 생성하는 프레임 워크이다. 하둡의 YARN에 의해 매니징되면, 맵리듀스의 능력을 유지함과 동시에 대용량데이터 처리 속도를 높힌다.

[ Tez와 MR아키텍처 비교 ]


하이브 엔진으로 Tez를 사용하여 쿼리속도를 높힌다.

* set hive.execution.engine=tez;



[ 2. 백터화 (Vectorization) ]

백터화는 작업시 단일 행을 가져오지 않고 한번의 작업으로 1,024개의 행을 가져온다. filter, join, aggregation과 같은 작업의 성능을 향상시킨다.

아래 커맨드로 환경구성을 한다.

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

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



[ 3. ORC파일, ORC SerDe ]

ORC(Optimized Row Columnar)파일 형식은 데이터원본 크기의 78%까지 줄여 저장시 매우 효율적인 방법을 제공한다. 

[ https://blog.cloudera.com/orcfile-in-hdp-2-better-compression-better-performance ]


초기 컬럼(row)단위로 저장되는 RC파일형식은 읽기과정에서 조인의 수행시간이 길었다. 그래서 컬럼과 함께 인덱스까지 저장하는 ORC파일형식의 등장으로 데이터의 압축과 함께 읽고 쓰는데 향상된 퍼포먼스를 제공할 수 있게 되었다.



Create Table Emp ( empId int, empName varchar(100), age int)

STORED AS ORC tblproperties("compress.mode"="SNAPPY") 



[ 4. 파티셔닝( Partitioning ) ]

하이브는 RDBMS와 다르게 디렉토리로 파일을 분리하여 저장한다. 분리되는 기준은 어떻게 테이블을 파티션을 했느냐에 따라 달라지며 쿼리성능을 좌우한다. 

* 파티션 생성예제 :

CREATE TABLE tb1( col1 STRING ) PARTITIONED BY ( yymmdd STRING );



[ 5. 버켓팅(Bucketing) ]

버켓팅은 데이터를 파일별로 나누어 저장한다. 지정된 컬럼의 값이 해쉬처리되어 조인시 쿼리속도가 더 빠르다. 파티션을 버켓으로 더욱 세분화하여 성능을 향상시킬 수 있다.

* 버켓 생성예제 : 

CREATE TABLE tb1 (col1 STRING ) CLUSTERED BY (col1) INTO 50 BUCKETS;



[ 6. CBO(Cost-Based Optimizer) ]

하이브의 CBO는 쿼리처리의 핵심 컴포넌트이다. Apache Calcite의 구동되며 쿼리질의에 대한 비용을 최적화하고 계산한다. 

Calcite는 쿼리재작성, Join수정 및 제거 등으로 다양한 최적화 작업을 한다. Calcite를 거친 논리작업은 Hive에의해 tree로 변환되어 물리적으로 최적화되고 Tez작업으로 바뀐 후 Hadoop클러스터에서 실행된다.

비용기반 최적화(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;



댓글 없음:

댓글 쓰기