Trino IcebergコネクタをDockerで試す方法
Trino Icebergコネクタを簡単に起動して試す方法をご紹介します。Icebergテーブルの中身が簡単に覗けるような流れにしており、CLIで完結するステップにしています。
まずはTrinoをDockerで起動します。Icebergのmetadataやdataファイルがホストからも参照できるようにディレクトリをマウントさせています。また、Trino IcebergカタログをSQLで生成できるように CATALOG_MANAGEMENTにdynamicを指定しています。
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 icebergUSING icebergWITH ( "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の開発に興味がある方はこちらの方法もぜひお試しください。