string(27) "/blog/?uid=187&mod=document"

HOME

ABOUT US

Blog

Blog

Blog

[HIVE] Transaction

2021.07.15

 

 

HIVE는 HDFS (하둡 분산 파일 시스템)에 저장된 데이터를 조회할 뿐만 아니라 HDFS에 데이터를 삽입, 삭제, 변경(Insert, Delete, Update)을 가할 수 있는 SQL 문을 지원하는 트랜잭션을 지원한다.

여기서 트랜잭션이란 하나의 작업을 수행하기 위해 필요한 데이터베이스의 연산들을 모아놓은 것으로, 데이터베이스에서 논리적인 작업의 단위이다. 즉, 기본적인 정보를 기록한 기본파일(master file)에 대해서 그 내용에 추가, 삭제 및 갱신을 가져오도록 하는 행위(거래)를 트랜잭션이라고 한다.

기본적으로 트랜잭션 처리 시스템 내에 갖추고 있어야 할 4가지 속성은 원자성 (Atomicity), 일관성 (Consistency), 독립성 (Isolation), 지속성 (Durability)로써 앞 글자를 따와 ACID라고 한다.

Atomicity는 성공적인 트랜잭션은 처리하고 성공적이지 않으면 처리하지 않는다.

Consistency는 트랜잭션이 분산 데이터를 일관된 상태에서 다른 일관된 상태로 전환해 주는지의 여부를 말하며,

Isolation은 트랜잭션이 한꺼번에 동시에 운영되는 다른 트랜잭션과는 무관하게 실행될 수 있는지의 여부를 의미한다.

Durability는 트랜잭션의 결과가 해당 트랜잭션이 처리된 후 남아 있는지에 관한 것을 나타낸다.

 

 

20210715152447_tcr2jy5.jpg
 

 

 

Hive에서 트랜잭션을 가하게 되면 처음 저장된 데이터는 테이블의 데이터를 기본 파일 세트에 저장하고,

그 이후 모든 트랜잭션(Insert, Update, Delete) 작업 데이터는 델타 파일 (차이점만 추출해낸 파일)에 저장하게 된다.

이후 데이터를 읽는 과정에서 기본파일과 델타 파일을 병합하여 최신 데이터를 표시한다. 

 

 

20210715152505_vd6fhd7.jpg
 

 

트랜잭션을 수행하는 Hive의 구성요소

Lock Manager

Hive의 Lock Manager는 모든 트랜잭션과 Lock을 관리하는 역할을 담당한다. 트랜잭션이 죽어있거나(에러가 발생돼서 트랜잭션이 비활성화됨을 의미), Lock이 중단되는 것을 방지하기 위해 정기적으로 Lock을 보유하고 있는 Lock Holder나 트랜잭션 발생자에서 메타스토어로 하트비트를 전송하여 트랜잭션과 Lock이 살아있는지 죽어있는지 확인한 후 해당 트랜잭션을 중단시킬지 결정한다.

하트비트는 시스템이 살아 있다는 것을 점검하기 위해 보내는 메시지

 

Compactor

Compactor는 ACID 시스템(트랜잭션)을 지원하기 위해 Metastore내에서 실행되는 일련의 백그라운드 프로세스이다.

 

Initiator

압축할 테이블 또는 파티션을 검색한다.

 

Worker

Compaction 작업을 처리할 모듈.

 

Cleaner

델타 파일이 더 이상 필요하지 않다고 판단하면 삭제하는 프로세스.

 

AcidHouseKeeperService

hive.txn.timeout으로 설정된 시간 내에 하트비트 되지 않은 트랜잭션을 찾아 중단시킨다.


Hive는 DB 트랜잭션 특성인 ACID를 지원한다. 하지만 RDBMS가 아니기에 서브 쿼리 미지원, 느린 쿼리 응답속도 등 제공하는 트랜잭션에 한계가 있다.

Hive Transaction 제약 사항

1) BEGIN, COMMIT, ROLLBACK 기능은 지원하지 않고 모두 auto-commit으로 동작한다.

2) ORC 파일 포맷만을 지원함.

3) Hive에서 테이블 생성 시 Bucket 설정 또한 있어야 함.

4) External Table의 경우 ACID 테이블을 만들 수 없으며, transaction 또한 지원하지 않음.

5) non-ACID session에서는 ACID Table에 대한 읽기 / 쓰기 작업을 할 수 없음.

6) Snapshot 격리 수준만을 지원하며 Isolation Level은 지원하지 않음

7) Transaction (transactional=true)을 지원하는 테이블은 LOAD DATA 쿼리를 사용할 수 없음.

Hive Transaction 예시

참고 자료 : Hive Transactions - Apache Hive - Apache Software Foundation

Hive 필수 설정

# hive의 메타 스토어에 있는 모든 잠금을 관리

set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

set hive.support.concurrency=true;

set hive.enforce.bucketing=true; # Hive 2.0부터 필요로 하지 않음

set hive.exec.dynamic.partition.mode=nonstrict;

# server side (Meta Store) 설정

set hive.compactor.initiator.on=true;


트랜잭션 지원 가능한 Table 생성 DDL Sample

CREATE TABLE test_hive_table ( id int, name string ) CLUSTERED BY (id, name) INTO 6 BUCKETS STORED AS ORC TBLPROPERTIES (

"transactional"="true",

"compactor.mapreduce.map.memory.mb"="2048",

"compactorthreshold.hive.compactor.delta.num.threshold"="4",

"compactorthreshold.hive.compactor.delta.pct.threshold"="0.5"

);

ALTER TABLE table_name COMPACT "minor" WITH OVERWRITE TBLPROPERTIES ("compactor.mapreduce.map.memory.mb"="3072");

ALTER TABLE table_name COMPACT "major" WITH OVERWRITE TBLPROPERTIES ("tblprops.orc.compress.size"="8192");