HDFS 에 파티션 디렉터리를 직접 만들어 데이터를 넣으면 메타스토어는 그 사실을 모른다. SHOW PARTITIONS 에는 안 보이고 조회 결과에도 빠진다. Hive 를 거치지 않는 적재 경로(distcp, NiFi, Spark 의 파일 직접 쓰기)에서 늘 생기는 문제다.
디렉터리를 훑어 메타스토어와 맞춘다.
MSCK REPAIR TABLE db.tbl;
MSCK REPAIR TABLE db.tbl ADD PARTITIONS;
MSCK REPAIR TABLE db.tbl DROP PARTITIONS;
MSCK REPAIR TABLE db.tbl SYNC PARTITIONS;
기본 동작은 추가뿐이다. 디렉터리가 사라진 파티션까지 정리하려면 DROP PARTITIONS, 양쪽을 맞추려면 SYNC PARTITIONS 를 쓴다.
파티션이 수만 개인 테이블에서는 한 번에 처리하다 메타스토어가 버티지 못한다. 배치 크기를 지정해 나눠 넣는다.
SET hive.msck.repair.batch.size=1000;
디렉터리 이름이 키=값 형식이 아니면 건너뛴다. hive.msck.path.validation 으로 검증 수준을 조절할 수 있지만, 규칙에 맞지 않는 디렉터리는 애초에 만들지 않는 편이 낫다.
개수가 적거나 위치가 warehouse 밖이면 직접 추가하는 쪽이 빠르고 안전하다.
ALTER TABLE db.tbl ADD IF NOT EXISTS
PARTITION (bse_dt='20240927') LOCATION '/data/tbl/bse_dt=20240927';
ALTER TABLE db.tbl DROP IF EXISTS PARTITION (bse_dt='20240901');
| 엔진 | 명령 | 대상 |
|---|---|---|
| Hive | MSCK REPAIR TABLE |
파일시스템 기준으로 파티션 목록 동기화 |
| Impala | ALTER TABLE ... RECOVER PARTITIONS |
새 파티션 디렉터리 인식 |
| Impala | REFRESH db.tbl |
파일 목록과 블록 위치만 다시 읽음 |
| Impala | INVALIDATE METADATA db.tbl |
메타데이터 전체를 버리고 다음 조회 때 다시 읽음 |
Hive 에는 ALTER TABLE ... RECOVER PARTITIONS 가 없다. 반대로 Impala 에는 MSCK REPAIR 가 없다. 같은 테이블을 두 엔진에서 쓰면 Hive 쪽에서 파티션을 맞춘 뒤 Impala 에서 REFRESH 를 거는 순서가 된다.