2019년 6월 26일 수요일

Hive 3.x의 새로운 변경 1. Managed Table vs External Table

Hive 3.x을 고려한다면 알아야할 변경 사항 1. Table Type

Managed Table 과 External Table


처음에 Hive 3.0이 나오면서 새로운 기능들에 초점을 맞추어 읽었고, (확실히 Hortonworks에서 Hive 개발을 많이 하는 가보다) Hive 3.0에 추가된 몇가지만 소개하면 아래와 같습니다.

  • Execution engine changes : Hive default engine으로서 Tez가 자리 잡다.
  • Design changes that affect security : 주요 권한 모델로 Ranger를 사용.
  • HDFS permission changes : Ranger를 안 쓴다면 HDFS ACL를 사용한다는 데 뭐가 바뀐건지는..
  • Transaction processing changes : 2에서 제공하던 transactional 기능과 성능 및 사용성 향상
  • Query execution of batch and interactive workloads : 뭔가 신기해보이는데 아직 잘 모르겠..

(위 내용은  HDP3 에서 hive 내용을 참고했습니다.)


 그런데 막상 적용하려고 보니 "기존에 제공하던 기능들이 여전히 잘 동작하느냐?" 가 관건이었고, 그 중에서도 테이블에 관한 변화에 대해서는 Hive 3을 고려할 때 가장 우선이 되어야할 내용이라고 생각했습니다.

 추가된 기능 상세 내용보다는 Hive 2와 비교해서 어떤 점이 달라졌고, 그래서 Hive 3을 쓰려면 무엇을 고려해야 하는지에 초점을 맞춰서 살펴보았습니다.

A. Managed Table의 default는 transactional(ACID)이며, ORC fileformat을 갖는다.

 - 기본 설정으로 사용할 경우, insert 뿐 아니라 row 단위의 update/delete가 가능하며 파티션별 트랜잭션으로 작업을 수행(isolation)합니다.

 - file format을 ORC외의 타입을 설정하면 insert_only로 지정됩니다.
 -- insert_only도 insert와 select 시에 실행 중인 것과 실패(aborted)된 트랜잭션을 고려하여 작업을 수행합니다.

 - transactional=true가 기본값으로 설정되며, managed table로서 사용하는 경우 변경할 수 없습니다.


B. Hive는 managed table에 대한 모든 제어 권한을 갖는다.

 - Managed table에 대한 데이터를 Hive를 통해서만 접근, 변경할 수 있습니다.
 -- 만약 Hive를 지나쳐서 data에 직접 접근하고 싶다면, external table을 사용하거나 Druid나 HBase 같은 storage handler를 사용해야 합니다.


아래 표는 Hive에서 사용하는 테이블 타입별 ACID 지원 여부와 필요로 하는 스토리지 포맷과 주요 SQL 처리에 대해 나타내고 있습니다.

Table TypeACIDFile FormatINSERTUPDATE/DELETE
Managed: CRUD transactionalYesORCYesYes
Managed: Insert-only transactionalYesAnyYesNo
Managed: TemporaryNoAnyYesNo
ExternalNoAnyYesNo


C. Managed table의 Owner는 Hive이다.


 - 위의 설명을 보면서, Insert-only transactional 을 보고 Hive 2에서 쓰던 일반 테이블과 비슷하겠구나 생각했었는데 이게 또 같지가 않았습니다.
 -- HDP 에서 2.x와 3.x의 테이블 타입의 차이점을 잘 설명하고 있습니다.

HDP 2.xHDP 3.x
Table TypeACID v1FormatOwner (user) of Hive Table FileTable TypeACID v2
ExternalNoNative or non-nativehive or non-hiveExternalNo
ManagedYesORChive or non-hiveManaged, updatableYes
ManagedNoORChiveManaged, updatableYes
non-hiveExternal, with data delete*No
ManagedNoNative (but non-ORC)hiveManaged, insert onlyYes
non-hiveExternal, with data delete*No
ManagedNoNon-nativehive or non-hiveExternal, with data delete*No

 - 위의 내용을 종합해서 보면, ORC 외의 native format (parquet, avro, rcfile 등)을 사용하는 managed table 중에서 hive가 아닌 외부 사용자(non-hive)를 통해서 데이터를 적재하던 테이블은 external table이 되어야 한다는 내용을 볼 수 있습니다.

 - external table로 사용해야 한다고 하더라도 with data delete*라고 해서 external.table.purge=true 테이블 프로퍼티를 사용하면 delete를 통해 HDFS에서의 삭제까지도 연결해서 사용 가능하도록 하고 있습니다.
-- https://issues.apache.org/jira/browse/HIVE-19981
-- 이 표 또한 HDP 문서인만큼 여기에선 문제가 없겠지만, 해당 JIRA를 보면 master에만 merge가 되었고 Fix Version에 4.0.0만 표기가 되어있습니다.
-- 즉 Apache Hive를 사용할 사람이라면 어느 버전에서 사용 가능할지 추가 확인이 필요합니다. 또한 이런 내용들(4.0.0에서나 반영될 수 있는 이슈와 버그)을 체크하여 patch 대상을 관리해야할 것으로 보입니다.



References
 - https://docs.hortonworks.com/HDPDocuments/Ambari-2.7.1.0/bk_ambari-upgrade-major-ppc/content/hive_post_upgrade_tasks.html
 - https://docs.hortonworks.com/HDPDocuments/HDP3/HDP-3.0.1/using-hiveql/content/hive_hive_3_tables.html
 - https://docs.hortonworks.com/HDPDocuments/HDP3/HDP-3.0.1/hive-overview/content/hive-apache-hive-3-architectural-overview.html