👏

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が使われているという関係性になっています。
https://zenn.dev/kameoncloud/articles/b7b58e0def2ec1

Amazon S3をデータソースとする場合、S3 Selectのサービス終了に伴いHive経由でHiveメタストアかAWS Glueストアを使う必要があるため手順が複雑になるので、今日はデータソースをAmazon RDS MySQLでやってみます。後日機会があればS3+Hive+Glueにも触れてみたいと思います。

さっそくやってみる

環境はAmazon Linux 2023 t3.xlargeを使います。

0. 環境設定

Trinoは以下のサイトより実行環境が整備済のコンテイメージが配布されていますのでそちらを使っていくためにまずはDockerをインストールしていきます。
https://trino.io/download

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