Hive Metastore 에는 없는데 Kudu 에는 남아 있는 테이블을 지워야 한다. 또는 Impala 에서 DROP TABLE 을 했는데 Kudu 쪽 테이블이 남아 이름 충돌이 난다.
kudu table list master01:7051,master02:7051,master03:7051
kudu table list master01:7051,master02:7051,master03:7051 | grep mytable
kudu table delete master01:7051,master02:7051,master03:7051 impala::mydb.mytable
Impala 가 만든 테이블은 Kudu 에서 impala::<db>.<table> 이라는 이름을 갖는다. 목록을 먼저 뽑아 정확한 이름을 확인한 뒤 지운다. kudu table delete 에는 --force 같은 별도 플래그가 없다. 삭제는 즉시 반영되며 되돌릴 수 없다.
지우기 전에 내용을 확인해 둔다.
kudu table describe master01:7051,master02:7051,master03:7051 impala::mydb.mytable
kudu table scan master01:7051,master02:7051,master03:7051 impala::mydb.mytable --num_threads=1 | head
Kudu 의 Hive Metastore 통합(--hive_metastore_uris)이 켜져 있으면 Kudu 테이블 생성·삭제가 Metastore 항목과 함께 관리된다. 이 구성에서 한쪽만 지우면 failed to drop Hive Metastore table: table not found 같은 오류가 난다.
점검과 자동 복구 도구가 있다.
kudu hms check master01:7051,master02:7051,master03:7051
kudu hms fix master01:7051,master02:7051,master03:7051
kudu hms list master01:7051,master02:7051,master03:7051
kudu hms fix 는 자동으로 고칠 수 있는 불일치만 처리한다. 기본 동작으로 Metastore 에 없는 Kudu 테이블의 HMS 항목을 만들고, 메타데이터가 다른 항목을 맞추고, 예전 Impala 형식의 항목을 갱신한다. 어떤 변경이 일어날지 check 로 먼저 확인한다.
Kudu 에서 지운 뒤에는 Impala 카탈로그를 갱신해야 이름이 풀린다.
INVALIDATE METADATA mydb.mytable;
SHOW TABLES IN mydb LIKE 'mytable*';
반대로 Kudu 테이블은 남기고 Impala 항목만 지우려면 외부 테이블로 만들어 두면 된다.
CREATE EXTERNAL TABLE mydb.mytable
STORED AS KUDU
TBLPROPERTIES ('kudu.table_name' = 'impala::mydb.mytable');
kudu table delete 는 확인 절차 없이 바로 지운다. 마스터 주소를 잘못 지정해 운영 클러스터의 동명 테이블을 지우는 사고가 가능하므로, 실행 전에 kudu table list 로 대상 클러스터를 확인한다.
삭제된 Kudu 테이블은 복구되지 않는다. Kudu 에는 HDFS 휴지통 같은 장치가 없다. 중요한 테이블은 Impala 로 Parquet 사본을 만들어 두고 지운다.