Impala 는 Iceberg 를 기본 지원한다. 별도 JAR 을 세션에 얹을 필요가 없다.
CREATE TABLE iceberg_db.sample (
id BIGINT,
name STRING,
created_at TIMESTAMP
)
STORED AS ICEBERG;
포맷 버전 2 로 만들려면 테이블 속성을 준다.
CREATE TABLE iceberg_db.sample_v2 (
id BIGINT,
name STRING
)
STORED AS ICEBERG
TBLPROPERTIES ('format-version' = '2');
기존 v1 테이블을 v2 로 올릴 수 있다. 되돌리는 것은 불가능하다.
ALTER TABLE iceberg_db.sample SET TBLPROPERTIES ('format-version' = '2');
| 값 | 의미 |
|---|---|
hive.catalog |
Hive Metastore 를 카탈로그로 사용. 기본값이며 여러 엔진이 공유하기 좋다 |
hadoop.catalog |
지정한 경로 아래를 카탈로그로 사용 |
hadoop.tables |
테이블 위치만 알고 직접 접근 |
이미 존재하는 Iceberg 테이블을 붙일 때는 외부 테이블로 선언한다. HiveCatalog 를 쓰고 같은 Metastore 를 바라본다면 별도 작업 없이 Impala 가 알아서 인식한다.
CREATE EXTERNAL TABLE ice_hadoop_tbl
STORED AS ICEBERG
LOCATION '/path/to/table'
TBLPROPERTIES ('iceberg.catalog' = 'hadoop.tables');
CREATE EXTERNAL TABLE ice_hadoop_cat
STORED AS ICEBERG
TBLPROPERTIES (
'iceberg.catalog' = 'hadoop.catalog',
'iceberg.catalog_location' = '/warehouse/iceberg',
'iceberg.table_identifier' = 'db.tbl'
);
metadata_location 을 직접 지정하려는 시도는 거부된다. 그 값은 카탈로그가 관리하는 항목이며 사용자가 DDL 로 설정하는 값이 아니다. 외부 테이블을 붙일 때는 위의 카탈로그 속성 조합을 쓴다.
Iceberg 는 숨은 파티션(hidden partitioning)을 쓴다. 파티션 값을 별도 컬럼으로 만들지 않고 변환 함수로 정의하며, 조회 시 파티션 컬럼을 따로 조건에 적지 않아도 가지치기가 된다.
CREATE TABLE iceberg_db.events (
id BIGINT,
event_time TIMESTAMP,
payload STRING
)
PARTITIONED BY SPEC (DAY(event_time))
STORED AS ICEBERG
TBLPROPERTIES ('format-version' = '2');
파티션 구성을 나중에 바꿀 수 있다. 기존 데이터는 그대로 두고 이후 쓰기부터 새 규칙을 적용한다.
ALTER TABLE iceberg_db.events SET PARTITION SPEC (MONTH(event_time));
CREATE TABLE iceberg_db.ice_ctas
STORED AS ICEBERG
AS SELECT id, name FROM source_table;
포맷 v2 테이블에서 Impala 4.3 부터 DELETE, 4.4 부터 UPDATE 를 실행할 수 있다. 두 경우 모두 position delete 파일을 쓰는 merge-on-read 방식이다. 그보다 낮은 버전에서는 v2 테이블을 읽을 수는 있어도 행 단위 수정은 되지 않는다.
DELETE FROM iceberg_db.events WHERE id = 100;
UPDATE iceberg_db.events SET payload = 'fixed' WHERE id = 101;
delete 파일이 쌓이면 읽기 성능이 떨어진다. 주기적으로 compaction 을 돌려 정리한다. Impala 에서 지원하지 않는 관리 작업은 Spark 의 Iceberg 프로시저로 처리하는 구성이 흔하다.
DESCRIBE FORMATTED iceberg_db.sample_v2;
SHOW FILES IN iceberg_db.sample_v2;
DESCRIBE HISTORY iceberg_db.sample_v2;
Iceberg 테이블 디렉터리의 파일을 외부에서 직접 넣거나 지우면 메타데이터와 어긋나 읽기가 깨진다. 적재와 삭제는 반드시 엔진을 통해 한다.
같은 테이블을 Impala 와 Spark 가 함께 쓴다면 두 엔진의 Iceberg 라이브러리 버전과 포맷 버전 지원 범위를 맞춘다.