스키마(DB) 이름을 주면 그 안의 Kudu 테이블을 모두 찾아, 각 테이블의 range 키·현재 range 파티션 수·실제 데이터가 들어 있는 파티션 수를 대조해 비어 있는(미사용) 파티션을 찾아내는 Python 도구(kudu_range_partition_audit.py)의 설계다. Windows PowerShell 에서 impyla 로 Impala 에 붙어 실행하며, 이후 FastAPI + SQLite 웹 도구(모니터링 / Master 상세 / History / 설정)로 확장됐다.
SHOW TABLES IN db 후 각 테이블의 SHOW CREATE TABLE 에 STORED AS KUDU 가 있는지로 Kudu 테이블만 고른다. _ext 같은 접미사는 --exclude 정규식으로 뺀다.SHOW RANGE PARTITIONS 결과 헤더가 RANGE (dt) 형태이므로 커서 description 에서 컬럼명을 뽑고, 실패하면 SHOW CREATE TABLE 의 PARTITION BY ... RANGE (...) 를 파싱한다. hash 구성(HASH(item) 6)과 PK 도 같은 DDL 에서 뽑는다.VALUES < x, a <= VALUES < b, VALUES >= x, VALUE = x, 다중 컬럼 ("A",1) <= VALUES < ("B",2), UNBOUNDED 를 하한/상한 튜플로 정규화한다. 문자열·정수·decimal·timestamp 를 타입 추론해 비교한다.groupby(기본): SELECT <range키>, COUNT(*) ... GROUP BY <range키> 한 번 실행 후 정렬된 하한 경계에 bisect 로 값을 배정한다. 스캔 1회지만 range 키 카디널리티가 크면 결과 행이 많아지므로 --groupby-limit 을 둔다.count: 파티션마다 COUNT(*) WHERE 경계조건 을 돌린다. 쿼리 수는 파티션 수만큼이지만 Kudu 프루닝이 걸려 개별 쿼리는 가볍다.--kudu-masters 를 주면 kudu table statistics 를 호출하고, Windows 처럼 CLI 가 없으면 master 웹 UI(/tservers)와 tserver /metrics?metrics=on_disk_size 를 긁어 합산한다. 평균 태블릿 크기는 (테이블 크기 − 미사용 파티션 크기) ÷ (태블릿 수 − 미사용 태블릿 수) 로 계산한다.create_time, check, table, rowcount, table_size, tablet_count, avg_tablet_size, pk, hash_partition, range_key, range_count, range_used, range_unused, node_dist 순이다. check 는 미사용 파티션이 있으면 1, 없으면 0, 점검 제외·실패는 -1(비-Kudu, hash 전용, 오류)이다. --emit-drop-ddl 은 ALTER TABLE ... DROP RANGE PARTITION 문을 파일로만 만들고 실행하지 않는다.python kudu_range_partition_audit.py --db mydb --config kudu.ini --out-dir C:\kudu-audit --verbose
; kudu.ini (우선순위: CLI 인자 > 환경변수 > 설정 파일)
[impala]
host = impala-coord.example.internal
port = 21050
user = svc_batch
[kudu]
web = km1.example.internal:8051,km2.example.internal:8051
[audit]
threads = 4
out_dir = C:\kudu-audit
--threads 병렬 처리 시 스레드마다 별도 커넥션을 만든다. 한 테이블이 실패해도 전체를 멈추지 않고 해당 행만 ERROR 로 남긴다..ps1)에 로직을 두지 않고 설정 파일·타임스탬프 출력 경로·실행 요약까지 전부 Python 안에 넣는다.hash_partition 컬럼의 저장 포맷(HASH(item) 6 / (no hash) / HASH(a) 2; HASH(b) 3)을 만드는 코드를 먼저 보고 파서를 맞춰야 한다. 포맷을 짐작해 파싱하면 hash 6 이 "없음" 으로, no hash 가 1 로 표시되는 오류가 난다. 다단 hash 는 곱한다.VALUES < x, VALUES >= x)은 지금 비어 있어도 지연 유입이나 미래 데이터를 받는 자리다. DROP DDL 생성 시 기본으로 제외하고 주석만 남기며, 포함하려면 --include-unbounded-ddl 을 준다.GROUP BY 풀스캔이 부담이면 --mode count 나 --include 로 범위를 좁힌다.