Kudu 는 자체 DDL 콘솔을 제공하지 않는다. 실무에서는 Impala SQL 로 만든다.
CREATE TABLE my_kudu_table (
id BIGINT,
name STRING,
age INT,
created_at TIMESTAMP,
PRIMARY KEY (id)
)
PARTITION BY HASH (id) PARTITIONS 8
STORED AS KUDU;
지켜야 할 제약이 셋 있다. 기본키가 반드시 있어야 하고, 기본키 컬럼은 NOT NULL 이며, 기본키 컬럼은 컬럼 정의에서 가장 앞에 와야 한다. 기본키 컬럼의 값은 나중에 바꿀 수 없다.
기본키를 컬럼 옆에 인라인으로 적는 형태도 된다.
CREATE TABLE my_kudu_table (
id BIGINT PRIMARY KEY,
name STRING
)
PARTITION BY HASH PARTITIONS 8
STORED AS KUDU;
Kudu 는 해시와 레인지 파티션을 함께 쓸 수 있다. 시간 축으로 레인지를 나누고 그 안에서 해시로 흩뿌리는 형태가 전형적이다.
CREATE TABLE events (
event_time TIMESTAMP,
device_id BIGINT,
payload STRING,
PRIMARY KEY (event_time, device_id)
)
PARTITION BY
HASH (device_id) PARTITIONS 8,
RANGE (event_time) (
PARTITION '2026-01-01' <= VALUES < '2026-02-01',
PARTITION '2026-02-01' <= VALUES < '2026-03-01'
)
STORED AS KUDU;
레인지 파티션은 나중에 추가하고 제거할 수 있다. 오래된 구간을 통째로 떼어내는 방식으로 보관 주기를 관리한다.
ALTER TABLE events ADD RANGE PARTITION '2026-03-01' <= VALUES < '2026-04-01';
ALTER TABLE events DROP RANGE PARTITION '2026-01-01' <= VALUES < '2026-02-01';
파티션 정의에 쓰는 컬럼은 모두 기본키에 포함돼 있어야 한다.
CREATE TABLE ... STORED AS KUDU 에서 구문 오류가 나거나 Kudu 를 모른다는 메시지가 나오면 Impala 와 Kudu 연결 설정을 본다.
SET;
KUDU_MASTER_HOSTS 또는 impalad 의 -kudu_master_hosts 플래그가 설정돼 있어야 한다. 설정이 없으면 테이블 속성으로 마스터 주소를 직접 준다.
CREATE TABLE my_kudu_table (
id BIGINT PRIMARY KEY,
name STRING
)
PARTITION BY HASH PARTITIONS 8
STORED AS KUDU
TBLPROPERTIES ('kudu.master_addresses' = 'master01:7051,master02:7051,master03:7051');
Kudu 서비스가 살아 있는지도 확인한다.
kudu cluster ksck master01:7051,master02:7051,master03:7051 | head -20
kudu table list master01:7051,master02:7051,master03:7051 | head
Impala 버전이 Kudu 를 지원하지 않는 아주 오래된 환경이 아니라면, 대부분 마스터 주소 설정 누락이나 서비스 장애다.
DESCRIBE my_kudu_table;
DESCRIBE FORMATTED my_kudu_table;
SHOW PARTITIONS my_kudu_table;
INSERT INTO my_kudu_table VALUES (1, 'Alice', 30, NOW());
SELECT * FROM my_kudu_table LIMIT 10;
해시 파티션 수는 나중에 바꿀 수 없다. 테이블을 다시 만들어 옮겨야 하므로 초기 설계에서 정한다. 태블릿 하나가 수십 GB 를 넘지 않도록 잡되, 태블릿이 지나치게 많으면 tablet server 의 메모리와 메타데이터 부담이 커진다.