はじめに
前回の記事では Apache Iceberg の概要と内部構造を説明しました。
今回は実際に手を動かして Iceberg を試せるローカル環境を構築していきます。
本記事のポイントは 「AWS などのクラウド環境は一切不要」 という点です。
Docker がインストールされていれば、ローカル PC だけで Iceberg の主要な機能を試すことができます。
本記事では、
- ローカル環境の構成
- Docker Compose を使った環境の起動
- Spark SQL での基本操作(テーブル作成・データ挿入・参照)
を順に説明します。
※本記事は Apache Iceberg 公式ドキュメント を参考にしています。
ローカル環境の構成
今回構築する環境は以下の 4 つのコンテナで構成されます。
| コンテナ | イメージ | 役割 |
|---|---|---|
| spark-iceberg | tabulario/spark-iceberg | Spark + Iceberg の実行環境 |
| iceberg-rest | apache/iceberg-rest-fixture | Iceberg REST カタログ |
| minio | minio/minio | S3 互換のオブジェクトストレージ |
| mc | minio/mc | MinIO の初期設定用クライアント |
クラウドを使わずに済む理由は、S3 の代わりに MinIO(S3 互換のオブジェクトストレージ)をローカルで動かすためです。
Iceberg のカタログには REST カタログを使います。
前提条件
以下がインストールされていれば OK です。
- Docker
- Docker Compose
環境のセットアップ
docker-compose.yml の作成
以下の内容を docker-compose.yml として保存します。
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 alias set 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:
docker-compose.yml の詳細説明(各サービスの設定を理解したい方向け)
spark-iceberg
Spark + Iceberg が事前設定済みの tabulario/spark-iceberg イメージを使用します。
rest と minio が起動してから立ち上がるよう depends_on で依存関係を定義しています。
MinIO への接続に必要な AWS 認証情報(ダミー値)を環境変数で渡しています。
Jupyter Notebook(8888)、Spark UI(8080)、Thrift Server(10000/10001)のポートを公開しています。
rest
Iceberg の REST カタログサーバーです。
テーブルのメタデータ管理を担い、データの実体は MinIO(s3://warehouse/)に保存するよう設定しています。
CATALOG_S3_ENDPOINT で MinIO のエンドポイントを指定することで、AWS S3 の代わりにローカルの MinIO を使用しています。
minio
S3 互換のオブジェクトストレージです。
warehouse.minio というネットワークエイリアスを設定することで、仮想ホスト形式(s3://warehouse/)のバケットアクセスを実現しています。
MinIO 管理コンソールは 9001 番ポートで公開されます。
mc
MinIO クライアントです。起動時に以下の初期設定を自動で行います。
- MinIO への接続確立
-
warehouseバケットの作成 - バケットのアクセスポリシーを public に設定
コンテナの起動
以下のコマンドでコンテナを起動します。
docker-compose up
初回はイメージのダウンロードが発生するため、少し時間がかかります。
起動後、以下の URL にアクセスできます。
| URL | 用途 |
|---|---|
| http://localhost:8888 | Jupyter Notebook |
| http://localhost:9001 | MinIO 管理コンソール |
基本操作
コンテナが起動したら、Spark SQL セッションを開始します。
docker exec -it spark-iceberg spark-sql
データベースの作成
CREATE DATABASE IF NOT EXISTS demo.nyc;
テーブルの作成
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);
demo がカタログ名、nyc がデータベース名、taxis がテーブル名です。
データの挿入
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');
データの参照
SELECT * FROM demo.nyc.taxis;
おわりに
Docker Compose を使って、クラウド環境なしで Iceberg を試せる環境を構築しました。
MinIO を S3 の代替として使うことで、実際のクラウド構成に近い形でローカル検証ができます。
次回は Iceberg のデータ更新フローについて詳しく説明していきます。
乞うご期待!