Trino で Amazon RDS にデータを書き込む
今日はTrinoを使ってみます。
Trino とは
TrinoとはPrestoといわれていた分散SQLエンジンです。様々なデータソースに対応していることが一つの特徴で、データをメモリ上で処理するため高速でクエリを実行させる、という点が特徴です。
(追記:Apache License 2.0で配布されていますが名称はApache Trinoではないそうです。失礼しました!)
Apache Hiveを用いずRDBとの連携も可能ですが、すでにHiveを用いている環境であれば、Hiveのメタデータストアを活用することも可能です。
さらに複数のデータソースに対して横断的なクエリの発行も可能となっています。
Amazon AthenがTrinoをサポートしており、(というよりバージョン3のエンジンがTrinoです)以下の手順では知らない間にTrinoが使われているという関係性になっています。
Amazon S3をデータソースとする場合、S3 Selectのサービス終了に伴いHive経由でHiveメタストアかAWS Glueストアを使う必要があるため手順が複雑になるので、今日はデータソースをAmazon RDS MySQLでやってみます。後日機会があればS3+Hive+Glueにも触れてみたいと思います。
さっそくやってみる
環境はAmazon Linux 2023 t3.xlargeを使います。
0. 環境設定
Trinoは以下のサイトより実行環境が整備済のコンテイメージが配布されていますのでそちらを使っていくためにまずはDockerをインストールしていきます。
sudo yum install -y docker
sudo systemctl start docker
sudo systemctl enable docker
1. Trino用コンテナの起動
sudo docker run -d -p 8080:8080 --name trino trinodb/trino
起動したらhttp://<ipaddress>:8080
にアクセスします。IPアドレスだけだとブラウザは勝手にhttps
にしますのでhttp
の入力を必ず行います。
ログイン画面が出れば起動成功です。
curlのコマンドも実行してみます。
curl -X POST http://localhost:8080/v1/statement -H "X-Trino-User: testuser" -d "SELECT 1"
X-Trino-User: testuser
ですが、なにがしかの認証を投げないとTrinoは反応しないようになっています。その設定を切ることもできますが、ユーザーIDはなんでも通りますので適当に投げておきます。
{"id":"20250322_040025_00001_arp8u","infoUri":"http://localhost:8080/ui/query.html?20250322_040025_00001_arp8u","nextUri":"http://localhost:8080/v1/statement/queued/20250322_040025_00001_arp8u/yb87e5d31a871309bf0091ed44032bee39e67988f/1","stats":{"state":"QUEUED","queued":true,"scheduled":false,"nodes":0,"totalSplits":0,"queuedSplits":0,"runningSplits":0,"completedSplits":0,"planningTimeMillis":0,"analysisTimeMillis":0,"cpuTimeMillis":0,"wallTimeMillis":0,"queuedTimeMillis":0,"elapsedTimeMillis":0,"finishingTimeMillis":0,"physicalInputTimeMillis":0,"processedRows":0,"processedBytes":0,"physicalInputBytes":0,"physicalWrittenBytes":0,"internalNetworkInputBytes":0,"peakMemoryBytes":0,"spilledBytes":0},"warnings":[]}
このような値が戻ってくれば起動成功です。
2. RDS MySQLの起動
起動の手順はこの記事では割愛します。
起動したらテスト用データベースを作成しておきます。
起動したらmysqlクライアントをインストールし接続を行います。
sudo dnf -y install https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm
sudo dnf -y install mysql mysql-community-client
mysql -h <mysql_host> -u <username> -p
次にスキーマを作成しておきます。Trino経由でのスキーマ作成はサポートされていないようです。
CREATE DATABASE my_new_schema;
3.Trino用Propertiesファイルの作成
Propertiesファイルとは各種データソースへの接続情報を格納している情報です。
mkdir -p ~/trino/etc/catalog
cat <<EOF > ~/trino/etc/catalog/mysql.properties
connector.name=mysql
connection-url=jdbc:mysql://your-mysql-host:3306
connection-user=root
connection-password=your-password
EOF
connection-url
,connection-user
,connection-password
は先ほど起動したRDS MySQLの手順に従って設定します。
sudo docker stop trino
sudo docker rm trino
sudo docker run -d -p 8080:8080 --name trino \
-v ~/trino/etc/catalog:/etc/trino/catalog \
trinodb/trino
4. 最後にテスト
起動出来たらTrino用CLIを用いてクエリを発行してみます。trino
コンテナの中にCLIがインストールされているので、コンテナの中から実行します。
sudo docker exec -it trino trino
SHOW SCHEMAS FROM mysql;
次にテーブルを作成します。Trino経由でのテーブル作成はPRIMARY KEY制約を指定できないようです。このためPRIMARY KEY制約が必要な場合はRDS側で作成しておく必要があります。
CREATE TABLE mysql.my_new_schema.users (
id INT,
name VARCHAR(100),
age INT
);
データを書きこみSELECTを行ってみます。
INSERT INTO mysql.my_new_schema.users (id, name, age)
VALUES
(1, 'John Doe', 30),
(2, 'Jane Smith', 25),
(3, 'Alice Johnson', 35);
select * from mysql.my_new_schema.users;
Discussion