2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Apache Iceberg 入門:ローカル環境セットアップ

2
Posted at

はじめに

前回の記事では 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 のデータ更新フローについて詳しく説明していきます。

乞うご期待!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?