🧊

Trino IcebergコネクタをDockerで試す方法

に公開

Trino Icebergコネクタを簡単に起動して試す方法をご紹介します。Icebergテーブルの中身が簡単に覗けるような流れにしており、CLIで完結するステップにしています。

まずはTrinoをDockerで起動します。Icebergのmetadataやdataファイルがホストからも参照できるようにディレクトリをマウントさせています。また、Trino IcebergカタログをSQLで生成できるように CATALOG_MANAGEMENTdynamicを指定しています。

docker run --rm --name trino -d -p 8080:8080 \
--volume /tmp/iceberg:/tmp/iceberg \
-e CATALOG_MANAGEMENT=dynamic trinodb/trino

次にコンテナ内のTrino CLIに接続します。

docker exec -it trino trino

デフォルトで存在するカタログを確認してみましょう。以下の5つのカタログが表示されるかと思います。

SHOW CATALOGS;
 Catalog
---------
 jmx
 memory
 system
 tpcds
 tpch

それではTrino Icebergカタログを作成してみましょう。 TESTING_FILE_METASTOREは名前からも分かるように、あくまでテスト向けのものなので本番環境では利用しないようご注意ください。メタストアのディレクトリにコンテナの起動時に指定したパスを設定します。

CREATE CATALOG iceberg 
USING iceberg
WITH (
 "iceberg.catalog.type" = 'TESTING_FILE_METASTORE',
 "hive.metastore.catalog.dir" = 'file:///tmp/iceberg',
 "fs.hadoop.enabled" = 'true'
);

カタログ作成直後はスキーマがinformation_schemaしか存在しないので、tpchというスキーマを準備して、その配下にテーブルを作成します。

CREATE SCHEMA iceberg.tpch;
CREATE TABLE iceberg.tpch.region AS SELECT * FROM tpch.tiny.region WITH NO DATA;

テーブル作成直後にストレージがどうなっているか見てましょう。SHOW CREATE TABLE文を実行するとlocationテーブルプロパティにパスが記載されています。コンテナの起動時にマウントしてあるので、ホスト側からファイルの状況を確認できます。

SHOW CREATE TABLE iceberg.tpch.region;
                               Create Table
---------------------------------------------------------------------------
 CREATE TABLE iceberg.tpch.region (
    regionkey bigint,
    name varchar,
    comment varchar
 )
 WITH (
    format = 'PARQUET',
    format_version = 2,
    location = 'file:///tmp/iceberg/tpch/region-8a373547f2944e4f9a7cd92f02ab7dee'
 )
tree /tmp/iceberg/tpch/region-8a373547f2944e4f9a7cd92f02ab7dee
/tmp/iceberg/tpch/region-8a373547f2944e4f9a7cd92f02ab7dee
└── metadata
    ├── 00000-aadb2eff-2307-421b-a051-333bbb277284.metadata.json
    └── snap-2846050716169058185-1-ff69e86f-8825-4ec5-ac88-a632a8ce1b5a.avro

現在はデータが空ですが、INSERT文を実行するとParquetファイルがdataディレクトリ内に作成され、metadataディレクトリも更新されていることが分かります。

INSERT INTO iceberg.tpch.region SELECT * FROM tpch.tiny.region;
tree /tmp/iceberg/tpch/region-8a373547f2944e4f9a7cd92f02ab7dee
/tmp/iceberg/tpch/region-8a373547f2944e4f9a7cd92f02ab7dee
├── data
│   └── 20240810_034632_00010_vdhvw-4fdb22b5-408b-436f-8f39-aad3c6aedbd4.parquet
└── metadata
    ├── 00000-aadb2eff-2307-421b-a051-333bbb277284.metadata.json
    ├── 00001-528adfc2-637f-4e81-9b70-f79ad7d3e7bf.metadata.json
    ├── 00002-c72245d5-6ef2-4e0c-b17b-639ce61673c1.metadata.json
    ├── 20240810_034632_00010_vdhvw-1c9997a5-fe87-44c7-99ca-90b684250a93.stats
    ├── 3cd57da6-1750-4173-b0ce-1729e3b95af7-m0.avro
    ├── snap-1285440851173177234-1-3cd57da6-1750-4173-b0ce-1729e3b95af7.avro
    └── snap-2846050716169058185-1-ff69e86f-8825-4ec5-ac88-a632a8ce1b5a.avro

他にもタイムトラベルメタデータテーブルなどIcebergコネクタの機能を自由に試せます。詳しくは公式のドキュメントをご参照ください。

https://trino.io/docs/current/connector/iceberg.html

普段Trino Icebergコネクタを開発している時は前述の方法は使わず、IcebergQueryRunnerというクラスを利用しています。これを使えば1クリックでIDE上でTrinoのサーバーが起動し、CLIから接続できるようになっています。Trinoは様々なカタログ(Hive Thrift metastore、Glue、JDBC、REST、Nessie、Snowflake、Polaris)やストレージ(S3、ABFS、GCS、MinIO)をサポートしており、この方法で日々デバッグしたり機能の追加を行っています。Trinoの開発に興味がある方はこちらの方法もぜひお試しください。

Discussion