DROP TABLE 을 실행했는데 테이블이 이미 존재한다는 메시지가 나오거나, 지워진 것처럼 보이는데 다시 만들려고 하면 충돌한다. Kudu 나 HBase 를 저장소로 쓰는 테이블에서 특히 자주 겪는다.
Impala 는 카탈로그 캐시를 갖고 있다. 다른 엔진(Hive, Spark, Kudu CLI)이 바꾼 내용은 캐시에 반영되기 전까지 보이지 않는다. 반대로 Impala 에서 지운 것을 다른 코디네이터가 아직 모를 수도 있다.
INVALIDATE METADATA mydb.mytable;
INVALIDATE METADATA;
REFRESH mydb.mytable;
인자 없는 INVALIDATE METADATA 는 전체 카탈로그를 무효화한다. 테이블이 많은 클러스터에서는 이후 첫 쿼리들이 크게 느려지므로 가급적 테이블을 지정한다.
| 테이블 종류 | DROP TABLE 이 지우는 것 |
남는 것 |
|---|---|---|
| 관리형(HDFS) | 메타데이터와 데이터 파일 | 없음 |
| 외부(HDFS) | 메타데이터 | 데이터 파일 |
| Kudu 관리형 | 메타데이터와 Kudu 테이블 | 없음 |
Kudu 외부(external.table.purge=false) |
메타데이터 | Kudu 테이블 |
| HBase 매핑 | 메타데이터 | HBase 테이블 |
Kudu 외부 테이블을 지운 뒤 같은 이름으로 다시 만들려 하면, Kudu 쪽 테이블이 남아 있어 충돌한다. Kudu 에 실제로 남아 있는지 확인한다.
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> 형식이다.
HBase 매핑 테이블이면 HBase 쪽에서 따로 지운다.
echo "disable 'my_hbase_table'; drop 'my_hbase_table'" | hbase shell -n
먼저 Impala 에 실제로 테이블이 있는지 본다.
SHOW TABLES IN mydb LIKE 'mytable*';
DESCRIBE FORMATTED mydb.mytable;
DESCRIBE FORMATTED 의 Table Type 과 저장소 관련 속성(kudu.table_name, hbase.table.name, external.table.purge)을 보면 어느 경계에 속하는지 바로 알 수 있다.
의존하는 뷰가 있으면 먼저 지운다. 권한이 없으면 오류 메시지가 모호하게 나오므로 권한도 확인한다.
Kudu 와 Metastore 가 어긋나면 한쪽에만 테이블이 남는다. Kudu 의 HMS 통합을 쓰는 환경이라면 점검과 복구 도구가 있다.
kudu hms check master01:7051,master02:7051,master03:7051
kudu hms fix master01:7051,master02:7051,master03:7051
kudu hms fix 는 자동으로 고칠 수 있는 불일치만 처리한다. 실행 전에 check 결과를 확인하고, 운영 클러스터에서는 어떤 항목이 바뀌는지 파악한 뒤 진행한다.