HBase 데이터를 HiveQL 로 조회하거나, 다른 테이블과 조인하거나, Parquet/CSV 로 다시 떨어뜨린다. Hive 의 HBaseStorageHandler 를 쓰면 HBase 테이블을 Hive 외부 테이블처럼 다룰 수 있다.
CREATE EXTERNAL TABLE employee_hive (
id STRING,
firstname STRING,
lastname STRING,
role STRING
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
'hbase.columns.mapping' = ':key,personal:firstname,personal:lastname,job:role'
)
TBLPROPERTIES (
'hbase.table.name' = 'employee_hbase'
);
hbase.columns.mapping 의 항목 수와 순서는 Hive 컬럼 목록과 정확히 일치해야 한다. :key 가 RowKey 에 대응한다. 컬럼 패밀리 전체를 맵으로 받으려면 Hive 쪽을 MAP<STRING,STRING> 으로 선언하고 매핑에 cf: 처럼 접두사만 적는다.
CREATE EXTERNAL TABLE hbase_map_table (
key STRING,
value MAP<STRING, STRING>
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ('hbase.columns.mapping' = ':key,cf:')
TBLPROPERTIES ('hbase.table.name' = 'my_hbase_table');
EXTERNAL 로 만들면 Hive 에서 DROP TABLE 해도 HBase 테이블은 남는다. EXTERNAL 없이 만들면 Hive 가 HBase 테이블까지 생성·삭제한다.
Hive 세션에 HBase 연동 JAR 이 올라와 있어야 한다. Cloudera 배포판처럼 통합된 환경에서는 대부분 이미 설정돼 있다.
hive --hiveconf hive.aux.jars.path=file:///opt/hive/lib/hive-hbase-handler.jar
ADD JAR /opt/hive/lib/hive-hbase-handler.jar;
Hive 가 ZooKeeper 쿼럼을 찾지 못하면 hive-site.xml 또는 세션에 hbase.zookeeper.quorum 을 지정한다.
Impala 는 Hive 메타스토어를 공유하므로, 위에서 만든 테이블을 메타데이터 갱신 후 그대로 읽는다.
INVALIDATE METADATA employee_hive;
SELECT * FROM employee_hive LIMIT 10;
다만 HBase 매핑 테이블은 RowKey 조건이 아니면 전체 스캔이 되므로 대용량에서는 느리다. 반복 분석이 목적이면 한 번 읽어 Parquet 테이블로 떨어뜨린 뒤 그쪽을 쓴다.
CREATE TABLE employee_parquet STORED AS PARQUET
AS SELECT * FROM employee_hive;
Impala 나 Hive 에서 DROP TABLE 해도 HBase 테이블 자체는 지워지지 않는다. 외부 테이블은 메타데이터만 지운다. HBase 테이블까지 없애려면 HBase 셸에서 따로 지운다.
echo "disable 'my_hbase_table'; drop 'my_hbase_table'" | hbase shell -n
매핑 컬럼의 타입을 STRING 이 아닌 숫자형으로 선언하면 HBase 에 저장된 바이트 표현과 해석이 어긋날 수 있다. HBase 쪽에 문자열로 적재했다면 Hive 도 STRING 으로 받고 필요할 때 캐스팅한다. #b 접미사(cf:col#b)를 붙이면 바이너리 직렬화로 해석한다.