Hive 트랜잭션
하이브는 0.13버전부터 트랜잭션을 지원한다. 파일 수정이 없는 HDFS의 특성상 모든 기능이 완벽하게 지원되지 않고, 기본(default) 트랜잭션 설정은 off로 되어 있다.
- BEGIN, COMMIT, ROLLBACK은 아직 지원하지 않음, 현재는 auto-commit 만 지원
- ORC 파일 포맷, 버켓팅 설정이 된 매니지드 테이블에서만 지원
- Non-ACID 세션에서는 ACID 테이블에 접근 불가
상세한 내용은 Hive Wiki를 참조하면 된다.
트랜잭션 구조
HDFS는 파일의 변경/수정을 지원하지 않는다. 따라서 HDFS에서 데이터의 수정, 삭제를 지원하기 위해서 데이터를 베이스(base) 파일에 기록하고, 트랜잭션이 발생할 때마다 델타(delta) 파일에 내용을 기록한다. 그리고 파일을 읽을 때 베이스 파일에 델타 파일의 내용을 적용하여 수정된 내용을 읽는다.
- 테이블이나 파티션은 베이스 파일의 집합으로 저장
- insert, update, delete 에 대해서는 델타 파일로 저장
- 읽는 시점에 베이스 파일과, 델터 파일을 합쳐서 수정된 내용을 반환
베이스 파일과 디렉토리 구조
파티션이 적용되지 않은 t 라는 테이블을 생성하였을 때 HDFS를 확인하면 구조가 다음과 같다.
- base* 파일의 집합으로 테이블의 데이터를 생성
- 내용이 수정될 때 마다 delta* 파일이 생성
hive> dfs -ls -R /user/hive/warehouse/t;
drwxr-xr-x - ekoifman staff 0 2016-06-09 17:03 /user/hive/warehouse/t/base_0000022
-rw-r--r-- 1 ekoifman staff 602 2016-06-09 17:03 /user/hive/warehouse/t/base_0000022/bucket_00000
drwxr-xr-x - ekoifman staff 0 2016-06-09 17:06 /user/hive/warehouse/t/delta_0000023_0000023_0000
-rw-r--r-- 1 ekoifman staff 611 2016-06-09 17:06 /user/hive/warehouse/t/delta_0000023_0000023_0000/bucket_00000
drwxr-xr-x - ekoifman staff 0 2016-06-09 17:07 /user/hive/warehouse/t/delta_0000024_0000024_0000
-rw-r--r-- 1 ekoifman staff 610 2016-06-09 17:07 /user/hive/warehouse/t/delta_0000024_0000024_0000/bucket_00000
Compactor
- 트랜잭션을 지원하기 위해서 메타스토어에서 수행되고 있는 백그라운드 프로세스
- 델타 파일이 많이 생기면, 마이너 컴팩션이 발생하여 델타 파일을 하나로 합침
- 델타 파일이 커지면, 메이저 컴팩션이 발생하여 베이스 파일을 수정
- Update, Delete 시점마다 MR 잡이 실행되지 않고, 주기적으로 수행되는 컴팩션 작업에의해 MR 잡이 처리
Compaction
- 마이너 컴팩션(minor compaction)
- 델타 파일을 모아서 버켓당 하나의 델타 파일로 다시 생성
- 메이저 컴팩션(major compaction)
- 베이스 파일과 델타 파일을 새로운 베이스 파일로 생성
트랜잭션 설정
트랜잭션 처리를 위한 테이블 설정
set hive.support.concurrency=true; set hive.enforce.bucketing=true; set hive.exec.dynamic.partition.mode=nonstrict; set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
메타스토어의 compactor 설정
- hive-site.xml 에 설정
<property> <name>hive.compactor.initiator.on</name> <value>true</value> </property> <property> <name>hive.compactor.worker.threads</name> <value>3</value> </property>
- hive-site.xml 에 설정
테이블 생성
테이블 생성시 다음과 같이 버켓팅 설정과 transactional 설정을 true 로 변경
CREATE TABLE table_name (
id int,
name string
)
CLUSTERED BY (id) INTO 2 BUCKETS STORED AS ORC
TBLPROPERTIES ("transactional"="true",
"compactor.mapreduce.map.memory.mb"="2048", -- specify compaction map job properties
"compactorthreshold.hive.compactor.delta.num.threshold"="4", -- trigger minor compaction if there are more than 4 delta directories
"compactorthreshold.hive.compactor.delta.pct.threshold"="0.5" -- trigger major compaction if the ratio of size of delta files to
-- size of base files is greater than 50%
);
컴팩터 설정 변경 방법은 다음과 같다.
ALTER TABLE table_name COMPACT 'minor'
WITH OVERWRITE TBLPROPERTIES ("compactor.mapreduce.map.memory.mb"="3072"); -- specify compaction map job properties
ALTER TABLE table_name COMPACT 'major'
WITH OVERWRITE TBLPROPERTIES ("tblprops.orc.compress.size"="8192"); -- change any other Hive table properties
트랜잭션 처리 상황을 확인하기 위해서는 다음의 명령으로 현재 상태를 확인한다.
show transactions;
show compactions;
show locks;
반응형