Kudu 의 표준 SQL 진입점은 Impala 다. Hive 로 Kudu 를 읽는 구성은 가능하지만 기능과 성능 모두 Impala 쪽이 앞선다. Hive 를 써야 하는 이유(기존 워크플로, Tez 기반 배치, MERGE 필요 등)가 분명할 때만 고른다.
Hive 로 읽을 수 있게 하려면 storage handler 가 필요하고, 클래스 이름이 배포판에 따라 다르다. Hive 4 는 자체 핸들러(org.apache.hadoop.hive.kudu.KuduStorageHandler)를 포함하고, Kudu 가 제공하는 kudu-hive jar 는 별도 클래스를 쓴다. 환경에서 어느 쪽이 설치돼 있는지 먼저 확인한다.
ls /opt/cloudera/parcels/CDH/lib/hive/lib/ | grep -i kudu
Kudu 에 이미 있는 테이블을 Hive 에 등록한다. 데이터는 Kudu 에 그대로 있고 Hive 는 메타데이터만 갖는다.
CREATE EXTERNAL TABLE hive_kudu_tbl
STORED BY 'org.apache.hadoop.hive.kudu.KuduStorageHandler'
TBLPROPERTIES (
'kudu.table_name' = 'impala::db.tbl',
'kudu.master_addresses' = 'master-01:7051,master-02:7051,master-03:7051'
);
kudu.table_name 값에 주의한다. Impala 로 만든 Kudu 테이블의 실제 이름은 impala::데이터베이스.테이블 형식인 경우가 많다. Kudu CLI 로 실제 이름을 확인한다.
kudu table list master-01,master-02,master-03
컬럼 목록을 다시 적지 않는다. 스키마는 Kudu 에서 가져오며, 적어 넣으면 오류가 나거나 실제와 어긋난다.
스키마가 바뀌면 Hive 쪽 정의도 다시 만들어야 하는 경우가 있다. Impala 는 Kudu 스키마를 직접 보므로 이런 재등록이 필요 없다.
조회 성능은 Impala 보다 떨어진다. Hive 는 Tez 잡을 띄워 스캔하므로 시작 비용이 크고, Kudu 로 밀어 넣을 수 있는 조건(predicate pushdown)의 범위도 좁다. 대량 배치 조인이라면 감내할 만하지만 대화형 조회에는 맞지 않는다.
갱신 작업은 Impala 로 한다. Hive 를 통한 Kudu 쓰기는 지원 범위가 좁고 버전 의존이 크다.