Lakehouse 런타임 카탈로그는 Apache Iceberg V3 테이블을 지원합니다. Apache Iceberg V3 사양의 핵심 기능은 바이너리 삭제 벡터입니다. 이 최적화는 행 수준 삭제를 .puffin 파일에 저장합니다.
쿼리 시간에 비용이 많이 드는 조인을 실행하는 대신 BigQuery 및 오픈소스 엔진 (예: Apache Spark, Apache Flink, Trino)은 이러한 벡터를 사용하여 삭제된 행을 빠르게 식별하고 건너뜁니다.
바이너리 삭제 벡터를 사용하면 다음과 같은 방식으로 성능을 개선할 수 있습니다.
- 대용량 쓰기: 대용량 쓰기가 있는 테이블의 쓰기 성능을 개선합니다.
- 효율적인 읽기: BigQuery 및 오픈소스 엔진이 삭제된 행을 식별하고 건너뛸 수 있도록 하여 쿼리 속도를 개선합니다.
이는 변경 데이터 캡처 (CDC) 파이프라인에서 대용량 업데이트 및 삭제를 처리하거나 전체 데이터 파일을 다시 작성하는 오버헤드 없이 특정 행을 삭제하여 GDPR (잊혀질 권리)과 같은 규제 요구사항을 충족하는 데 특히 유용합니다.
시작하기 전에
-
BigLake API를 사용 설정합니다.
API 사용 설정에 필요한 역할
API를 사용 설정하려면
serviceusage.services.enable권한이 포함된 서비스 사용량 관리자 IAM 역할(roles/serviceusage.serviceUsageAdmin)이 필요합니다. 역할 부여 방법 알아보기
필요한 역할
Iceberg V3 테이블을 만들고 관리하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트 및 스토리지 버킷에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
-
전체:
- BigLake 관리자 (
roles/biglake.admin) - 프로젝트 - 스토리지 관리자 (
roles/storage.admin) - 대상 Cloud Storage 버킷
- BigLake 관리자 (
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
Iceberg REST 카탈로그 설정
Iceberg V3 테이블을 만들기 전에 네임스페이스와 카탈로그를 만드는 것을 포함하는 Iceberg REST 카탈로그를 설정해야 합니다.
Iceberg REST 카탈로그를 설정하는 데 시간이 걸릴 수 있습니다. 계속하기 전에 네임스페이스와 카탈로그를 모두 만들어야 합니다.
제한사항
Lakehouse 런타임 카탈로그의 Iceberg V3 테이블에는 다음과 같은 제한사항이 있습니다.
- 새 V3 데이터 유형: 새 Iceberg V3 데이터 유형 (예: Variant, Geography, 나노초 타임스탬프, 기본값, 알 수 없는 데이터 유형)은 지원되지 않습니다.
- 행 계보 추적: 행 계보 추적은 지원되지 않습니다.
- BigQuery 쓰기: BigQuery 쓰기는 V3 테이블에서 지원되지 않습니다. BigQuery에서 V3 테이블을 읽을 수만 있습니다. V3 테이블을 만들고 쓰려면 오픈소스 엔진 (예: Apache Spark, Apache Flink, Trino)을 사용해야 합니다.
엔진 요구사항
Iceberg V3 및 바이너리 삭제 벡터를 지원하는 엔진 버전을 사용해야 합니다. Apache Spark 3.5 이상을 사용하는 것이 좋습니다. 이 가이드의 예에서는 iceberg-spark-runtime-3.5_2.12:1.10.1을 사용합니다.
테이블 및 엔진 세션을 구성할 때는 다음을 확인하세요.
- 테이블 형식 버전:
format-version='3'으로 설정해야 합니다. - 삭제 모드:
merge-on-read로 설정해야 합니다. 이 모드는 삭제가 원래 데이터 파일을 다시 작성하는 대신 (쓰기 시 복사) 별도의 파일 (삭제 벡터)에 작성되도록 합니다.
Spark 세션 구성 예시
다음 구성은 필요한 Iceberg 확장 프로그램을 사용 설정하고 REST 카탈로그 연결을 설정합니다.
spark-sql \ --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.10.1,org.apache.iceberg:iceberg-gcp:1.10.1 \ --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-gcp-bundle/1.10.1/iceberg-gcp-bundle-1.10.1.jar \ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \ --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.CATALOG_NAME.type=rest \ --conf spark.sql.catalog.CATALOG_NAME.uri=https://biglake.googleapis.com/iceberg/v1/restcatalog \ --conf spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_PATH \ --conf spark.sql.catalog.CATALOG_NAME.header.x-goog-user-project=PROJECT_ID \ --conf spark.sql.catalog.CATALOG_NAME.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager \ --conf spark.sql.catalog.CATALOG_NAME.io-impl=org.apache.iceberg.gcp.gcs.GCSFileIO \ --conf spark.sql.defaultCatalog=CATALOG_NAME
다음을 바꿉니다.
CATALOG_NAME: Apache Iceberg REST 카탈로그 엔드포인트의 이름입니다.WAREHOUSE_PATH: 데이터 웨어하우스가 저장된 Cloud Storage 폴더의 URI입니다.gs://로 시작합니다.PROJECT_ID: 프로젝트 ID입니다. Google Cloud
바이너리 삭제 벡터 사용
Apache Iceberg V3 테이블에서 바이너리 삭제 벡터를 사용하려면 형식 버전 3으로 테이블을 만들고, 테이블을 데이터로 채우고, 표준 데이터베이스 수정을 실행하고, 테이블을 쿼리해야 합니다. Spark SQL을 사용하여 모든 create, insert, delete, update 문을 실행할 수 있습니다.
바이너리 삭제 벡터가 있는 Iceberg 테이블 만들기
테이블 속성에서 format-version='3' 및 merge-on-read 삭제,
업데이트, 병합 모드를 지정하는 테이블을 만듭니다. Spark SQL에서 다음 문을 실행합니다.
Spark
CREATE NAMESPACE IF NOT EXISTS my_namespace;
USE my_namespace;
CREATE TABLE my_namespace.mytable_v3 (
id BIGINT,
city STRING,
state STRING
) TBLPROPERTIES (
'format-version'='3',
'write.delete.mode'='merge-on-read',
'write.update.mode'='merge-on-read',
'write.merge.mode'='merge-on-read'
);
Iceberg V2 테이블을 V3으로 업그레이드
ALTER TABLE 문을 사용하여 기존 Iceberg V2 테이블을 V3으로 업그레이드할 수 있습니다. 테이블을 V3에서 V2로 다운그레이드하는 것은 지원되지 않습니다. Spark SQL에서 다음 문을 실행합니다.
Spark
ALTER TABLE my_namespace.mytable_v2 SET TBLPROPERTIES ('format-version' = '3');
데이터를 테이블에 삽입
삭제를 위해 바이너리 삭제 벡터 파일이 생성되도록 하려면 엔진이 쓰기 시 복구로 대체되지 않아야 합니다. 일반적으로 삭제 작업을 수행하기 전에 테이블에 상당한 양의 데이터가 있어야 합니다. 예를 들어 Apache Spark는 쓰기 시 복구로 대체하여 작은 삭제를 최적화할 수 있습니다. Spark SQL에서 다음 문을 실행하여 테이블을 채웁니다.
Spark
-- Create a temporary view with a large number of rows (100,000 rows)
CREATE OR REPLACE TEMPORARY VIEW large_source AS
SELECT
id,
CAST(id AS STRING) as city,
'WA' as state
FROM (
SELECT row_number() OVER (ORDER BY (SELECT NULL)) as id
FROM (SELECT 0 FROM range(1000)) a
CROSS JOIN (SELECT 0 FROM range(100)) b
);
-- Overwrite the existing table with the generated data
INSERT OVERWRITE my_namespace.mytable_v3 SELECT * FROM large_source;
데이터 삭제
Spark SQL에서 DELETE 문을 실행합니다. 테이블이 merge-on-read로 구성되어 있고 데이터가 충분하므로 Spark는 바이너리 삭제 벡터를 사용하여 삭제 파일을 생성합니다.
Spark
DELETE FROM my_namespace.mytable_v3 WHERE id = 5000;
데이터 업데이트
Spark SQL에서 UPDATE 문을 실행합니다. 테이블이 merge-on-read로 구성되어 있고 데이터가 충분하므로 Spark는 바이너리 삭제 벡터를 사용하여 삭제 파일을 생성합니다.
Spark
UPDATE my_namespace.mytable_v3 SET state = 'NY' WHERE id = 1;
테이블 쿼리
테이블에 대한 쿼리는 바이너리 삭제 벡터 파일을 자동으로 사용하여 삭제된 행을 제외합니다. Apache Spark 또는 BigQuery를 사용하여 테이블을 쿼리할 수 있습니다.
Spark
-- Should be less than the initial 100,000 rows
SELECT count(*) FROM my_namespace.mytable_v3;
-- Should return no results
SELECT * FROM my_namespace.mytable_v3 WHERE id = 5000;
-- Should return 'NY'
SELECT * FROM my_namespace.mytable_v3 WHERE id = 1;
BigQuery
BigQuery에서 쿼리할 때는 정규화된 테이블 식별자 PROJECT_ID.CATALOG_NAME.my_namespace.mytable_v3을 사용합니다.
bq query --nouse_legacy_sql \ 'SELECT * FROM `PROJECT_ID.CATALOG_NAME.my_namespace.mytable_v3` LIMIT 10'
바이너리 삭제 벡터 생성 확인
스토리지 디렉터리 및 스냅샷 메타데이터를 검사하여 바이너리 삭제 벡터가 생성되었는지 확인할 수 있습니다.
.puffin 파일 확인
Cloud Storage 웨어하우스의 테이블 데이터 디렉터리
(예: gs://WAREHOUSE_BUCKET/my_namespace/mytable_v3/data)로 이동합니다.
바이너리 삭제 벡터를 저장하는 .puffin 파일이 표시됩니다.
스냅샷 메타데이터 검토
Iceberg 테이블의 JSON 파일에 있는 스냅샷 메타데이터에는 삭제 작업에 대한 정보가 포함되어 있습니다. 스냅샷 요약에서 added-delete-files, added-dvs, operation과 같은 속성을 찾습니다. 이렇게 하면 삭제 파일이 추가되었음을 확인할 수 있습니다.
"summary": {
"operation": "delete",
"added-delete-files": "1",
"added-dvs": "1",
"added-files-size": "42",
"added-position-deletes": "1",
...
}
다음 단계
- BigQuery로 테이블을 쿼리하고 카탈로그 페더레이션을 사용하는 방법을 알아보세요.
- Apache Iceberg용 Lakehouse for Apache Iceberg REST 카탈로그 테이블에 대해 알아보세요.