Iceberg REST Catalog (iceberg-rest-fixture)の設定サンプル
IcebergのRESTカタログとしてtabulario/iceberg-restを利用している方々も多いと思いますが、バージョン1.6.0で更新は止まっているので、他のRESTカタログを探す必要があります。
この記事では、移行先の候補の1つであるIceberg RESTカタログ(apache/iceberg-rest-fixture)にTrinoから接続する例をご紹介します。DBはPostgreSQL、ストレージはMinIOを利用しています。
Dockerコンテナの起動
iceberg-rest-fixtureイメージにPostgreSQLのJDBCドライバが含まれていないので、あらかじめローカルにダウンロードしておきます。
curl -o ./postgresql-42.7.5.jar https://jdbc.postgresql.org/download/postgresql-42.7.5.jar次にdocker-compose.ymlファイルを用意します。 iceberg-rest-fixture部分の環境変数は、以下の流れでプロパティに置換されます。
CATALOG_プレフィックスを削除- アンダースコア2つ(
__)を-に置換 - アンダースコア1つ(
_)を.に置換 - 小文字に変換
例えばCATALOG_S3_PATH__STYLE__ACCESSはs3.path-style-accessになります。
volumes: data: {}
services: postgresql: container_name: postgresql image: postgres:12 environment: POSTGRES_DB: 'test' POSTGRES_USER: 'test' POSTGRES_PASSWORD: 'test' ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 5s retries: 3
minio: container_name: minio image: quay.io/minio/minio environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin ports: - "9000:9000" - "9001:9001" volumes: - data:/data command: server /data --console-address ":9001"
create-bucket: image: minio/mc depends_on: - minio volumes: - data:/data entrypoint: mc mb /data/bucket
irc: hostname: irc image: apache/iceberg-rest-fixture:1.8.1 depends_on: postgresql: condition: service_healthy minio: condition: service_started volumes: - ./postgresql-42.7.5.jar:/usr/lib/iceberg-rest/postgresql-42.7.5.jar ports: - "8181:8181" environment: CATALOG_URI: jdbc:postgresql://postgresql:5432/test CATALOG_JDBC_USER: test CATALOG_JDBC_PASSWORD: test AWS_REGION: us-east-1 CATALOG_WAREHOUSE: s3://bucket/warehouse/ CATALOG_IO__IMPL: org.apache.iceberg.aws.s3.S3FileIO CATALOG_S3_ENDPOINT: http://minio:9000 CATALOG_S3_PATH__STYLE__ACCESS: true CATALOG_S3_ACCESS__KEY__ID: minioadmin CATALOG_S3_SECRET__ACCESS__KEY: minioadmin
command: java -cp /usr/lib/iceberg-rest/*:iceberg-rest-adapter.jar org.apache.iceberg.rest.RESTCatalogServer
trino: container_name: trino image: trinodb/trino:474 environment: CATALOG_MANAGEMENT: 'dynamic' depends_on: - irc - minio ports: - "8080:8080"docker-compose.ymlファイルの準備が完了したらコンテナを起動します。なお、IRCはIceberg Rest Catalogの略称です。海外のIcebergコミュニティで時々使われる略称なので、覚えておくと良いと思います。
docker compose upTrinoからRESTカタログへ接続
Trinoのコンテナ内にCLIがインストールされているので、以下のコマンドでCLIに接続します。
docker exec -it trino trinoIcebergコネクタを利用したカタログを作成します。カタログ名は何でも良いですが、分かりやすいようにコネクタ名と一致させています。
CREATE CATALOG icebergUSING icebergWITH ( "iceberg.catalog.type" = 'REST', "iceberg.rest-catalog.uri" = 'http://irc:8181', "fs.native-s3.enabled" = 'true', "s3.endpoint" = 'http://minio:9000', "s3.aws-access-key" = 'minioadmin', "s3.aws-secret-key" = 'minioadmin', "s3.path-style-access" = 'true', "s3.region" = 'us-east-1');スキーマやテーブルが無い状態なので、作成してみます。
CREATE SCHEMA iceberg.default;CREATE TABLE iceberg.default.region AS SELECT * FROM tpch.tiny.region;テーブルの中身を確認すると5件の結果が返却されます。
SELECT * FROM iceberg.default.region;JDBCカタログのテーブルを参照
せっかくなので、RESTカタログの裏側で利用されているPostgreSQLにも接続してみましょう。
CREATE CATALOG postgresqlUSING postgresqlWITH ( "connection-url" = 'jdbc:postgresql://postgresql:5432/test', "connection-user" = 'test', "connection-password" = 'test');postgresqlカタログに対してSHOW TABLESを実行するとiceberg_namespace_propertiesとiceberg_tablesの2つのテーブルが返却されます。
SHOW TABLES IN postgresql.public; Table------------------------------ iceberg_namespace_properties iceberg_tablesiceberg_namespace_propertiesテーブルを参照すると、前述のステップで作成したdefaultネームスペースが存在します。
SELECT * FROM postgresql.public.iceberg_namespace_properties; catalog_name | namespace | property_key | property_value--------------+-----------+--------------+---------------- rest_backend | default | exists | trueiceberg_tablesテーブルを参照すると、こちらも前述のステップで作成したregionテーブルが存在します。
SELECT * FROM postgresql.public.iceberg_tables;-[ RECORD 1 ]--------------+----------------------------------------------------------------------------------------------------------------------------------------catalog_name | rest_backendtable_namespace | defaulttable_name | regionmetadata_location | s3://bucket/warehouse/default/region-d03afd016e9145638f8cd90da3547a9d/metadata/00001-8805ad43-32f8-4ea2-9feb-71282143daff.metadata.jsonprevious_metadata_location | s3://bucket/warehouse/default/region-d03afd016e9145638f8cd90da3547a9d/metadata/00000-a33d125e-ec4d-40ca-8370-461a08c64a87.metadata.jsoniceberg_type | TABLE結果が横に長いので、見やすいように少し加工しています。
MinIOからIcebergのコンテンツを確認
Icebergのコンテンツを確認したい場合は、Webブラウザで http://localhost:9001/ を開き、ユーザー名とパスワードにminioadminを入力してログイン後に、Object Browserから参照できます。
