하이브 성능 향상의 한 방법인 벡터화(vectorized) 처리는 한 번에 처리하는 데이터의 양을 늘려서 CPU 사용률을 높이고, 처리속도를 빠르게 하는 기법입니다. 검색, 필터, 집계, 조인 처리에서 사용되고, 한 번에 1024개의 행을 동시에 처리하여 속도를 높입니다.
벡터화 설정을 하면 1024행(row)의 블록으로 한번에 작업을 처리합니다. 하나의 블록에서 열(column)은 배열로 처리됩니다. 아래의 클래스와 같이 칼럼이 ColumnVector클래스 배열로 한 번에 읽어서 처리합니다.
조회, 필터링 등에 벡터화를 이용하면 한번에 처리하는 작업이 증가하여 속도가 빨라지게 됩니다. 16억 건의 데이터를 이용해서 count
명령을 처리한 결과 벡터화 처리를 하지 않으면 67.6초, 벡터화 처리를 하면 31.5초로 성능이 향상되는 것을 확인하였습니다. 몇 번의 테스트 결과 count 같은 경우에는 40~50% 정도의 성능 향상을 확인할 수 있었습니다.
벡터화 처리
벡터화 처리를 위해서는 데이터를 ORC 포맷으로 저장하고, 다음의 옵션을 설정해야 합니다.
-- 기본값은 false
set hive.vectorized.execution.enabled=true;
사용가능 데이터 타입
- tinyint
- smallint
- int
- bigint
- boolean
- float
- double
- decimal
- date
- timestamp (see Limitations below)
- string
사용 가능 쿼리
- arithmetic: +, -, *, /, %
- AND, OR, NOT
- comparisons <, >, <=, >=, =, !=, BETWEEN, IN ( list-of-constants ) as filters
- Boolean-valued expressions (non-filters) using AND, OR, NOT, <, >, <=, >=, =, !=
- IS [NOT] NULL
- all math functions (SIN, LOG, etc.)
- string functions SUBSTR, CONCAT, TRIM, LTRIM, RTRIM, LOWER, UPPER, LENGTH
- type casts
- Hive user-defined functions, including standard and generic UDFs
- date functions (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, UNIX_TIMESTAMP)
- the IF conditional expression
Explain 확인
벡터화 처리가 가능한 쿼리인지는 Explain 명령으로 확인할 수 있습니다. 벡터화 처리가 가능하면 아래와 같이 vectorized 문구를 확인할 수 있습니다.
STAGE PLANS:
Stage: Stage-1
Map Reduce
Alias -> Map Operator Tree:
alltypesorc
TableScan
alias: vectorizedtable
Statistics: Num rows: 1 Data size: 95 Basic stats: COMPLETE Column stats: COMPLETE
Select Operator
Statistics: Num rows: 1 Data size: 95 Basic stats: COMPLETE Column stats: COMPLETE
Group By Operator
aggregations: count()
mode: hash
outputColumnNames: _col0
Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
Reduce Output Operator
sort order:
Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
value expressions: _col0 (type: bigint)
Execution mode: vectorized
Reduce Operator Tree:
Group By Operator
aggregations: count(VALUE._col0)
mode: mergepartial
outputColumnNames: _col0
Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
File Output Operator
compressed: false
Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
table:
input format: org.apache.hadoop.mapred.TextInputFormat
output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
Stage: Stage-0
Fetch Operator
limit: -1
Processor Tree:
ListSink
상세한 내용은 하이브의 위키에서 확인할 수 있습니다.
https://cwiki.apache.org/confluence/display/Hive/Vectorized+Query+Execution
반응형
'빅데이터 > hive' 카테고리의 다른 글
[hive] 구체화 뷰(Materialized View) (0) | 2020.01.21 |
---|---|
[hive] UDF에서 발생하는 argument type mismatch 오류 수정 (0) | 2020.01.14 |
[hive] 하이브의 조인방식(hive join) (0) | 2020.01.06 |
[hive] Blobstore 기능으로 처리 속도 증가 (0) | 2019.12.19 |
[hive] MSCK is missing partition columns under location. 오류 해결 방법 (0) | 2019.12.04 |