5分で始めるTrinoとAlluxio

Trinoは、1つ以上の異種データソースに分散された大規模データセットを照会するために設計されたオープンソース分散型SQLクエリエンジンです。Trinoは、大量のデータを処理し、レポートを生成することで、データウェアハウス、ETL、インタラクティブな分析を行うために設計されています。

Alluxioは、大規模な分析とAIのためのオープンソースデータオーケストレーションプラットフォームです。Alluxioは、TrinoやApache Sparkなどの計算フレームワークとAmazon S3、Google Cloud Storage、HDFS、MinIOなどの様々なストレージシステムの間に位置しています。

これは、Icebergコネクタを使用してTrinoのキャッシングレイヤーとしてAlluxioを展開するためのチュートリアルです。

Trinoのキャッシングが必要な理由は何ですか?

A small fraction of the petabytes of data you store is generating business value at any given time. Repeatedly scanning the same data and transferring it over the network consumes time, compute cycles, and resources. This issue is compounded when pulling data from disparate Trino clusters across regions or clouds. In these circumstances, caching solutions can significantly reduce the latency and cost of your queries.

Trinoは、Hiveコネクタに組み込まれたキャッシングエンジンであるRubixを備えています。このシステムはTrinoに付属しているため便利ですが、Hiveコネクタに限定されており、2020年以来維持されていません。また、セキュリティ機能や追加の計算エンジンのサポートが不足しています。

Alluxio上のTrino

AlluxioはTrinoを様々なストレージシステムに接続し、データ駆動型アプリケーションのためのAPIと統一された名前空間を提供します。Alluxioを使用すると、Trinoはデータソースに関係なくデータにアクセスでき、頻繁にアクセスされるデータ(例えば、一般的に使用されるテーブル)をAlluxio分散ストレージに透過的にキャッシュできます。

MinIOファイルストレージ上のIcebergコネクタを介したAlluxioキャッシングの使用

MinIOでのwrite-throughキャッシングを使用するAlluxioを構成する方法を示すデモを作成しました。これは、Icebergコネクタを使用し、Trinoの観点からテーブルの場所プロパティを1つの変更することで実現されます。

このデモでは、Alluxioは別のサーバー上で実行されていますが、Trinoと同じノード上で実行することが推奨されます。これは、Alluxioのすべての設定がAlluxioが実行されているサーバーに配置される一方、Trinoの設定は影響を受けないことを意味します。Alluxioを外部で実行する利点は、Trinoとリソースを争わないことですが、欠点はAlluxioから読み取る際にデータをネットワーク経由で転送する必要があることです。TrinoとAlluxioが同じネットワーク上にあることはパフォーマンスにとって重要です。

このデモを進めるために、こちらにあるコードをコピーしてください。

Trinoの設定

Trinoは標準のIceberg設定と同様に設定されています。AlluxioがTrinoの外部で実行されているため、必要な設定は起動時ではなくクエリ時です。

Alluxioの設定

Alluxioの設定はすべてalluxio-site.propertiesファイルを使用して設定できます。すべての設定をdocker-compose.ymlに配置して保持するため、Javaプロパティを使用してALLUXIO_JAVA_OPTS環境変数を介して設定しています。このチュートリアルでは、マスターノードをリーダー、ワーカーをフォロワーと呼んでいます。

リーダーの設定

 
alluxio.master.mount.table.root.ufs=s3://alluxio/

リーダーはポート1999819999を公開し、後者はWeb UIのポートです。

フォロワーの設定

 

alluxio.worker.ramdisk.size=1G
alluxio.worker.hostname=alluxio-follower

フォロワーはポート2999930000を公開し、Alluxioがデータを格納するために使用する共有メモリを設定します。これはshm_sizeプロパティを介して1Gに設定され、alluxio.worker.ramdisk.sizeプロパティから参照されます。

リーダーとフォロワー間の共有設定

 

alluxio.master.hostname=alluxio-leader

# Minioの設定
alluxio.underfs.s3.endpoint=http://minio:9000
alluxio.underfs.s3.disable.dns.buckets=true
alluxio.underfs.s3.inherit.acl=false
aws.accessKeyId=minio
aws.secretKey=minio123

# デモ専用の設定
alluxio.security.authorization.permission.enabled=false

alluxio.master.hostnameは、すべてのノード、リーダーおよびフォロワーに設定する必要があります。ほとんどの共有設定は、このケースではMinIOであるunderfsをAlluxioに向けます。

alluxio.security.authorization.permission.enabledは、Dockerの設定を簡単に保つために“false”に設定されています。

注意: これは、本番環境やCI/CD環境で行うことを推奨しません。

サービスの実行

まず、サービスを起動します。trino-getting-started/iceberg/trino-alluxio-iceberg-minioディレクトリにいることを確認してください。次のコマンドを実行してください:

 
docker-compose up -d

以下の出力を期待できます。Dockerはまた、「Created/Started」メッセージが表示される前にDockerイメージをダウンロードする必要がある場合がありますので、余分な出力がある場合があります。

 

[+] Running 10/10
 ⠿ Network trino-alluxio-iceberg-minio_trino-network          Created                                                                                                                                                                                                      0.0s
 ⠿ Volume "trino-alluxio-iceberg-minio_minio-data"            Created                                                                                                                                                                                                      0.0s
 ⠿ Container trino-alluxio-iceberg-minio-mariadb-1            Started                                                                                                                                                                                                      0.6s
 ⠿ Container trino-alluxio-iceberg-minio-trino-coordinator-1  Started                                                                                                                                                                                                      0.7s
 ⠿ Container trino-alluxio-iceberg-minio-alluxio-leader-1     Started                                                                                                                                                                                                      0.9s
 ⠿ Container minio                                            Started                                                                                                                                                                                                      0.8s
 ⠿ Container trino-alluxio-iceberg-minio-alluxio-follower-1   Started                                                                                                                                                                                                      1.5s
 ⠿ Container mc                                               Started                                                                                                                                                                                                      1.4s
 ⠿ Container trino-alluxio-iceberg-minio-hive-metastore-1     Started

Trino CLIを開く

これが完了したら、Trinoコーディネーターノードにログインできます。これを行うには、execコマンドを使用し、コンテナ上で実行するコマンドとしてtrino CLI実行可能ファイルを実行します。コンテナIDがtrino-alluxio-iceberg-minio-trino-coordinator-1であることに注意してください。そのため、実行するコマンドは次のようになります:

 

<<<<<<< HEAD
docker container exec -it trino-alluxio-iceberg-minio-trino-coordinator-1 trino
=======
docker container exec -it trino-minio_trino-coordinator_1 trino
>>>>>>> alluxio

このステップを開始すると、起動が完了するとtrinoカーソルが表示されるはずです。完了したときの外観は次のようになります:

 
trino>

この設定がどのように機能するか最もよく理解するために、TPCコネクタからデータをプッシュするCTAS(CREATE TABLE AS)クエリを使用してIcebergテーブルを作成してみましょう。これはMinIOを指すIcebergにポイントします。TPCコネクタはデータをリアルタイムで生成するため、このような簡単なテストを実行できます。

まず、カタログを表示するコマンドを実行して、CTASクエリで使用するtpchおよびicebergカタログを確認します:

 
SHOW CATALOGS;

Icebergカタログが登録されていることがわかるはずです。

MinIOバケットとTrinoスキーマ

起動時に、mc CLI for MinIOを含む初期化コンテナで次のコマンドが実行されます。これにより、/alluxioという名前のMinIO内のバケットが作成され、データの書き込み先とTrinoがそれを見つける場所が得られます:

 

/bin/sh -c "
until (/usr/bin/mc config host add minio http://minio:9000 minio minio123) do echo '...waiting...' && sleep 1; done;
/usr/bin/mc rm -r --force minio/alluxio;
/usr/bin/mc mb minio/alluxio;
/usr/bin/mc policy set public minio/alluxio;
exit 0;
"

注意:このバケットはAlluxioのマウントポイントとして機能するため、Alluxio内のスキーマディレクトリalluxio://lakehouse/s3://alluxio/lakehouse/にマッピングされます。

Trinoのクエリ

では、MinIOのバケットを指すSCHEMAを作成し、CTASクエリを実行していきましょう。ターミナルに戻り、iceberg.lakehouse SCHEMAを作成してください。これにより、Alluxio名前空間内のスキーマの場所を保存するために、メタストアへの最初の呼び出しが行われます。Alluxioをデフォルトのファイルシステムとして設定していないため、ホスト名alluxio-leaderとポート19998を指定する必要があることに注意してください。DDLステートメントを管理するユーザーに対してAlluxioキャッシングをデフォルトの使用方法として透明に使用したい場合は、この点を考慮してください。

 

CREATE SCHEMA iceberg.lakehouse
WITH (location = 'alluxio://alluxio-leader:19998/lakehouse/');

Alluxioによって同期されるMinIOのバケットを参照するSCHEMAがあるので、最初のテーブルを作成できます。

オプション: クエリの実行を確認するには、Trino UIにログインし、セキュリティが設定されていないため、ユーザー名は任意で構いません。

生成された小さなTPCHデータからMinIOに顧客データをCTASクエリで移動します。以下のクエリを実行し、Trino UIで実行状況を見たい場合はそれも可能です。

 

CREATE TABLE iceberg.lakehouse.customer
WITH (
  format = 'ORC',
  location = 'alluxio://alluxio-leader:19998/lakehouse/customer/'
) 
AS SELECT * FROM tpch.tiny.customer;

次に、Alluxio UIMinIO UIに移動し、AlluxioおよびMinIOのファイルを参照してください。これで、TrinoがAlluxioに書き込み、AlluxioがMinIOに書き込むデータを含むlakehouseディレクトリが含まれるcustomerディレクトリが表示されます。

現在、AlluxioとMinIOの下にテーブルがあります。以下の方法でこのデータを照会できます:

 
SELECT * FROM iceberg.lakehouse.customer LIMIT 10;

Trinoが実際にAlluxioから読み取っていて、MinIOではないことをどうやって確認するのでしょうか? MinIOのデータを削除してから、再度クエリを実行して確認してみましょう。このデータを削除した後、データが返されるはずです。

サービスの停止

このチュートリアルを完了したら、この演習で使用したリソースを次のコマンドで解放できます:

 
docker-compose down

結論

この時点で、TrinoとAlluxioの理解が深まり、TrinoとAlluxioのデプロイ方法、およびIcebergコネクタとMinIOファイルストレージでAlluxioキャッシングを使用する方法について学びました。この記事を楽しんでいただけたことを願っています。この記事にいいねをして、質問があればコメントを残してください!

Source:
https://dzone.com/articles/get-started-with-trino-and-alluxio-in-five-minutes