빅데이터/hive

[hive] 트랜잭션(Transactional, ACID) 테이블 구성

hs_seo 2018. 5. 21. 14:54

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>
      


테이블 생성

테이블 생성시 다음과 같이 버켓팅 설정과 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;


반응형