Hive 잠금(lock)
Hive 잠금(lock)
· Version : Hive
HiveQL은 SQL과 유사하지만 잠금(locking)에 대한 메커니즘은 완전히 다르다. SQL과 비교한다면 매우 부족한 lock 모델을 가지고 있다. 하둡이 제한된 의미의 이어쓰기 (append)를 지원하고 있지만 전통적으로는 write-once(한번쓰면 변경이 불가능하다는 의미) 의 특성을 가지고 있기 때문에 이러한 특성과 맵리듀스의 스트리밍 읽기 방식으로 인해 세밀한 잠금에 대한 접근은 불필요하기 때문이다.
그러나 하둡은 다중 사용자 시스템이기 때문에 잠금과 코디네이션이 필요할수도 있다. 예를들어 INSERT OVERWRITE 쿼리는 테이블의 모든 내용을 덮어쓰고 다른 사용자가 동시에 테이블에 쿼리를 시도하면 쿼리가 실패하거나 잘못된 결과를 반환할 수 있기 때문에 명시적으로 테이블에 잠금이 필요할 수도 있다.
하이브는 아파치 주키퍼(Apache Zookeeper)를 이용하여 잠금을 제공한다. 주키퍼는 분산 코디네이션을 구현한 오픈소스로 Kafka 등 분산 코디네이션이 필요한 환경에서 많이 사용 한다. 하이브에서 주키퍼를 코디네이션으로 사용하려면 주피커 쿼럼 노드를 등록해야한다. hive-site.xml에서 설정할 수 있다.
#통신할 주키퍼 목록을 등록, 읽기/쓰기 잠금을 위해서만 필요 <property> <name>hive.zookeeper.quorum</name> <value>hadoopcluster01:2181,hadoopcluster02:2181</value> </property>
#동시성을 제공할지 설정, 최소 하나의 주키퍼가 등록되어 있어야 한다. <property> <name>hive.support.concurrency</name> <value>true</value> </property> |
위 설정으로 하이브는 쿼리를 실행할때 자동으로 잠금이 지원되며 현재 모든 잠금 목록을 확인하기 위해서는 아래 스크립트를 실행한다.
hive> show locks; hive>show locks 테이블명 extended; |
동시성 기능이 true로 설정되어 있는 경우 하이브는 자동으로 두 가지 종류의 잠금 기능을 제공한다. 테이블을 읽을 때에는 공유 잠금(shared lock)을 사용하고, 테이블을 수정할 때는 배타적 잠금(exclusive lock)을 사용한다. 테이블이 파티션닝 되어 있을때 파티션에 대한 베타적 잠금을 얻게 되면 파티션이 수정되는 동안 테이블 삭제 시도와 같은 동시 변경이 발생되지 못하도록 테이블 자체에 공유 잠금을 건다. 베타적 잠금은 테이블의 모든 파티션에 영향을 미친다.
명시적으로 잠금을 관리할수도 있으며 아래 스크립트는 명시적으로 베타 잠금을 생성한다.
hive>lock table 테이블명 exclusive; |
명시적 잠금 해제는 unlock 명령을 사용한다.
hive>unlock table 테이블명; |
[참고자료]
https://cloudera.ericlin.me/2015/05/how-table-locking-works-in-hive/
2020-10-22 / Sungwook Kang / http://sungwookkang.com
Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, Hive, Hive tunning, 하이브 튜닝, 하이브락, hive lock, 하이브 잠금