Apache Icebergの公式ドキュメントにて、クイックスタートを発見!早速やってみました。
クイックスタートはSparkを使うものとHiveを使うものが用意されています。
今回は、Spark版を試しました。
環境構築
環境は、Docker Composeで構築します。
ドキュメントに記載のあるdocker-compose.yml
を作成します
docker-compose.yml
version: "3"
services:
spark-iceberg:
image: tabulario/spark-iceberg
container_name: spark-iceberg
build: spark/
networks:
iceberg_net:
depends_on:
- rest
- minio
volumes:
- ./warehouse:/home/iceberg/warehouse
- ./notebooks:/home/iceberg/notebooks/notebooks
environment:
- AWS_ACCESS_KEY_ID=admin
- AWS_SECRET_ACCESS_KEY=password
- AWS_REGION=us-east-1
ports:
- 8888:8888
- 8080:8080
- 10000:10000
- 10001:10001
rest:
image: apache/iceberg-rest-fixture
container_name: iceberg-rest
networks:
iceberg_net:
ports:
- 8181:8181
environment:
- AWS_ACCESS_KEY_ID=admin
- AWS_SECRET_ACCESS_KEY=password
- AWS_REGION=us-east-1
- CATALOG_WAREHOUSE=s3://warehouse/
- CATALOG_IO__IMPL=org.apache.iceberg.aws.s3.S3FileIO
- CATALOG_S3_ENDPOINT=http://minio:9000
minio:
image: minio/minio
container_name: minio
environment:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=password
- MINIO_DOMAIN=minio
networks:
iceberg_net:
aliases:
- warehouse.minio
ports:
- 9001:9001
- 9000:9000
command: ["server", "/data", "--console-address", ":9001"]
mc:
depends_on:
- minio
image: minio/mc
container_name: mc
networks:
iceberg_net:
environment:
- AWS_ACCESS_KEY_ID=admin
- AWS_SECRET_ACCESS_KEY=password
- AWS_REGION=us-east-1
entrypoint: >
/bin/sh -c "
until (/usr/bin/mc config host add minio http://minio:9000 admin password) do echo '...waiting...' && sleep 1; done;
/usr/bin/mc rm -r --force minio/warehouse;
/usr/bin/mc mb minio/warehouse;
/usr/bin/mc policy set public minio/warehouse;
tail -f /dev/null
"
networks:
iceberg_net:
コンテナが3つ定義されています。
- tabulario/spark-iceberg : Sparkがこれ?
- apache/iceberg-rest-fixture : Icebergがこれ?
- minio/minio : S3互換オブジェクトストレージのはず
起動します。
docker compose up
これで完了です。
アクセスしてみる
docker-compose.yml
に、PORTの設定があったのでまずは片っ端からアクセスしてみます。
- spark-icebergコンテナ
- minioコンテナ
クイックスタートの手順を実行
ノートブックでクイックスタートの手順をやってみましょう。
SparkSQL、Spark-Shell、PySparkの3通り方法が記載されていますが、今回はSparkSQLを使用しました。
-
Creating a table
CREATE TABLE demo.nyc.taxis ( vendor_id bigint, trip_id bigint, trip_distance float, fare_amount double, store_and_fwd_flag string ) PARTITIONED BY (vendor_id);
セルの先頭に
%%sql
と書くとSQLと認識するようです。テーブル作成後、Minioの「warehouse/nyc/taxis/metadata」にファイルが作成されました。
metadataファイル
00000-7b48b19d-7693-43ed-8c0a-ed453826ce32.metadata.json{ "format-version" : 2, "table-uuid" : "b077f2e1-7ba7-4c84-99d9-d91cac34fa72", "location" : "s3://warehouse/nyc/taxis", "last-sequence-number" : 0, "last-updated-ms" : 1736166858036, "last-column-id" : 5, "current-schema-id" : 0, "schemas" : [ { "type" : "struct", "schema-id" : 0, "fields" : [ { "id" : 1, "name" : "vendor_id", "required" : false, "type" : "long" }, { "id" : 2, "name" : "trip_id", "required" : false, "type" : "long" }, { "id" : 3, "name" : "trip_distance", "required" : false, "type" : "float" }, { "id" : 4, "name" : "fare_amount", "required" : false, "type" : "double" }, { "id" : 5, "name" : "store_and_fwd_flag", "required" : false, "type" : "string" } ] } ], "default-spec-id" : 0, "partition-specs" : [ { "spec-id" : 0, "fields" : [ { "name" : "vendor_id", "transform" : "identity", "source-id" : 1, "field-id" : 1000 } ] } ], "last-partition-id" : 1000, "default-sort-order-id" : 0, "sort-orders" : [ { "order-id" : 0, "fields" : [ ] } ], "properties" : { "owner" : "root", "write.parquet.compression-codec" : "zstd" }, "current-snapshot-id" : null, "refs" : { }, "snapshots" : [ ], "statistics" : [ ], "partition-statistics" : [ ], "snapshot-log" : [ ], "metadata-log" : [ ] }
-
Writing Data to a Table
INSERT INTO demo.nyc.taxis VALUES (1, 1000371, 1.8, 15.32, 'N'), (2, 1000372, 2.5, 22.15, 'N'), (2, 1000373, 0.9, 9.01, 'N'), (1, 1000374, 8.4, 42.13, 'Y');
Minio上にファイルが作成されます。
データ
自動的にパーティションが作成される
データはParquet形式で作成される
-
Reading Data from a Table
SELECT * FROM demo.nyc.taxis;
登録したデータが取得できました
以上、触りだけですがクイックスタートをやってみました。
サンプルノートブックがたくさんあります
- Iceberg - An Introduction to the Iceberg Java API
- Iceberg - Berlin Buzzwords 2023
- Iceberg - Getting Started
- Iceberg - Integrated Audits Demo
- Iceberg - Table Maintenance Spark Procedures
- Iceberg - View Support
- Iceberg - Write-Audit-Publish (WAP) with Branches
- PyIceberg - Getting Started
- PyIceberg - Write support