watsonx.data SaaS版のPresto エンジンに Presto CLI からアクセス

\* IBM Cloud上のSaaS版についての記載です

[watsonx.data](https://www.ibm.com/jp-ja/products/watsonx-data)は「単一の統合データ・プラットフォームですべての企業データを収集、保存、照会、分析するためのデータ管理ソリューションです。オープン・データ・フォーマットに最適化された、柔軟で信頼性の高いプラットフォームを提供します」とのことで、いわゆるデータレイクハウスです。SW版とSaaS版があります。

当記事はwatsonx.data SaaS版のPrestoエンジンにpythonからアクセスするための方法について説明します。

[watsonx.data](https://www.ibm.com/jp-ja/products/watsonx-data)は「単一の統合データ・プラットフォームですべての企業データを収集、保存、照会、分析するためのデータ管理ソリューションです。オープン・データ・フォーマットに最適化された、柔軟で信頼性の高いプラットフォームを提供します」とのことで、いわゆるデータレイクハウスです。SW版とSaaS版があります。

当記事はwatsonx.data SaaS版のPrestoエンジンにPresto CLIからアクセスするための方法について説明します。
尚、公式ドキュメントでは[Connecting to Presto server](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-con-presto-serv#conn-to-prestoeng)の「Connecting to Presto engine using Presto CLI (Remote)」に記述されている内容です。

今回試した実行環境は以下です:

- java version "1.8.0_311"
- Apple M1 Pro

> 2024/08/08 最新の情報で改訂

# 1. 事前準備
[watsonx.data SaaS版のPrestoエンジンにアクセスするための事前情報取得](https://qiita.com/nishikyon/items/2687572b6ecce1e54bb5)を参考に
watsonx.data SaaS版のPrestoエンジンにアクセスするための事前情報
- ホスト名
- ポート番号
- IBM API key
- IBM IAM token　(オプション)


を取得しておいてください。

尚、[ドキュメント](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-con-presto-serv#get-api-iam-token)によるとIBM IAM tokenの方がワークロード的におすすめとのことです。

ただIBM API key は一度取得したら削除するまで使えますが、IBM IAM tokenは作成後1時間有効となり、有効期限があります。どちらも使用可能なので、状況に合わせて選択してください。


# 2. CLIの導入
### 1-1. 前提環境
Presto CLIはjavaのjarファイルを実行する形式です。よってJavaが実行できる環境が(JRE)が導入済みである必要があります。
ターミナルまたはコマンドプロプトから`java -version`を実行してみて、結果としてJavaのVersionが返ってくるか確認してください。

実行例:
```shell
$ java -version
java version "1.8.0_311"
Java(TM) SE Runtime Environment (build 1.8.0_311-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.311-b11, mixed mode)
$
```

### 1-2. jarファイルのダウンロード
https://prestodb.io/docs/current/installation/cli.html よりjarファイルをダウンロードします。2024年8月8日現在は `presto-cli-0.288-executable.jar`というファイルへのリンクがあり、それをクリックしてダウンロードしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/f2469a24-35bf-fb52-9dff-6cde31972dcb.png)


### 1-3. ダウンロードしたjarファイルを`presto`にリネームして、実行可能にする。

以下はMacで`presto-cli-0.283-executable.jar`というjarファイルだった場合の実行例:
```shell-session
mv presto-cli-0.288-executable.jar presto
chmod a+x presto
```

### 1-4.導入確認
以下のコマンドでPrestoのcli versionが表示されればOKです。
```sh
./presto --version
```
出力例：
```
$ ./presto --version
Presto CLI 0.288-15f14bb
$
```

# 3. Presto CLI からアクセス
### a. IBM API key使用の場合
```sh
./presto --server https:<ホスト名>:<ポート番号> \
--catalog iceberg_data --schema default \
--user ibmlhapikey --password
```
尚、`--catalog`と`--schema`は省略可能です。
```sh
./presto --server https:<ホスト名>:<ポート番号> \
--user ibmlhapikey --password
```
実行するとパスワードを聞かれるので、IBM API key の値を入力します。

実行例:
```sh
$ ./presto --server https://xxxx.lakehouse.appdomain.cloud:99999 --user ibmlhapikey --password

Password:
presto>
```

### b. IBM IAM token使用の場合

userの`ibmlhtoken_<your-username>`の`<your-username>`部分にはアクセスに使用するIBM CloudのIDを入れてください。
IBM CloudのIDが`aaa@bbb.com` であれば　`ibmlhtoken_aaa@bbb.com` となります。
（↑2024/08/08現在`ibmlhtoken`ではアクセスできなかったので修正）
```sh
./presto --server https:<ホスト名>:<ポート番号> \
--catalog iceberg_data --schema default \
--user ibmlhtoken_<your-username> --password
```
尚、`--catalog`と`--schema`は省略可能です。
```sh
./presto --server https:<ホスト名>:<ポート番号> \
--user ibmlhtoken_<your-username> --password
```
実行するとパスワードを聞かれるので、IBM IAM tokenの値を入力します。
IBM IAM tokenは長いので現実的に考えると環境変数`PRESTO_PASSWORD`に事前に入れて使うのがよいかもしれません。環境変数`PRESTO_PASSWORD`の値がセットされている場合はパスワードは聞かれません。

パスワードを聞かれる実行例（IBM CloudのIDは`aaa@bbb.com`としています）:
```sh
$ ./presto --server https://xxxx.lakehouse.appdomain.cloud:99999 --user ibmlhtoken_aaa@bbb.com --password

Password:
presto>
```

IBM IAM tokenを環境変数`PRESTO_PASSWORD`に入れる実行例:
(IBM CloudのIDは`aaa@bbb.com`としています）
(jqコマンドが必要です。ない場合は`brew install jq`で導入する)
```sh
APIKEY=xxxxxxxxxxxxxxxxxxxxxxxx
export PRESTO_PASSWORD=$(curl --silent -X POST 'https://iam.cloud.ibm.com/identity/token' -H 'Content-Type: application/x-www-form-urlencoded' -d "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=${APIKEY}" | jq -r '.access_token' )
./presto --server https://xxxxx.lakehouse.appdomain.cloud:99999 --user ibmlhtoken_aaa@bbb.com --password
presto>

```

# 4. 接続確認

`presto>`のプロンプトが出てくるので、以下のコマンドを打ちます:
`show catalogs;`
カタログのリストがでてきます。

実行例:
```
presto> show catalogs;
      Catalog
-------------------
 icos_nishito_hive
 jmx
 nishito_iceberg
 system
 tpcds
 tpch
(6 rows)

Query 20230828_073700_24257_ffx64, FINISHED, 2 nodes
Splits: 36 total, 36 done (100.00%)
[Latency: client-side: 0:02, server-side: 0:01] [0 rows, 0B] [0 rows/s, 0B/s]

presto>
```
SQLの実行も可能です:
```
select * from tpch.tiny.customer limit 10;
```
実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/7d8338bd-23e6-3a3e-e8c7-cf8c65f55fcc.png)
プロンプトに収まりきらない場合は、unix系のlessコマンドで実行されるので、lessコマンドの操作方法で中身を見てください。lessコマンドに入った場合は、`q`の入力で抜けます。

ヘルプはhelpと打ってください:
```
presto> help

Supported commands:
QUIT
EXPLAIN [ ( option [, ...] ) ] <query>
    options: FORMAT { TEXT | GRAPHVIZ }
             TYPE { LOGICAL | DISTRIBUTED }
DESCRIBE <table>
SHOW COLUMNS FROM <table>
SHOW FUNCTIONS
SHOW CATALOGS [LIKE <pattern>]
SHOW SCHEMAS [FROM <catalog>] [LIKE <pattern>]
SHOW TABLES [FROM <schema>] [LIKE <pattern>]
USE [<catalog>.]<schema>

presto>
```
prestoプロンプトを抜けるのは`quit`と打ってください
```
presto> quit
$
```

# 5. 参考Link
presto　CLIの使い方はいまいちいいドキュメントが見当たりませんでしたが、コマンドはこちらに一覧があります：
[SQL Statement Syntax](https://prestodb.io/docs/current/sql.html)

presto　CLI のドキュメントはこちらですが、シンプルな説明のみです
[Command Line Interface](https://prestodb.io/docs/current/installation/cli.html)

以上です。

# 6. 関連リンク
- [watsonx.data SaaS版のPrestoエンジンにアクセスするための事前情報取得](https://qiita.com/nishikyon/items/2687572b6ecce1e54bb5)
- [watsonx.data SaaS版のPresto エンジンにpythonからアクセス](https://qiita.com/nishikyon/items/b5afeb5263a37957c00d)
- [watsonx.data SaaS版のPresto エンジンにDBeaverからアクセス](https://qiita.com/nishikyon/items/3aa33e5501570bc12827)