[Oracle Cloud] Presto から Object Storage のデータを参照する

# はじめに

Presto から、OCI Object Storage へ参照するための手順を確認します。Object Storage には、S3互換API があり、これを使用してアクセスが出来ます。

Hive/Hadoop や Hive Metastore(MySQL) の環境は、[こちらの記事](https://qiita.com/sugimount/items/80e2b201c43856f74166)で構築しています。
Presto の環境は、[こちらの記事](https://qiita.com/sugimount/items/77077d5bb6352debce48)で構築しています。



# Customer Secret Keys 生成

Object Storage を S3 API でアクセスするためには、OCI IAM ユーザー上で、Customer Secret Key を生成する必要があります。Customer Secret Key を生成することで、Access Key と Secret Key が生成されます。この2種類の Key が必要です。

OCI Console の右上のユーザー名を選択して、ユーザーの詳細画面へ移動します。

![1581848373047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/3cfd70fb-153c-a5a9-c091-c303cfb3411e.png)



Customer Secret Keys のメニューに移動して、Generate Secret Key を押します

![1581848412021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/d16c3513-94c1-d2f9-fe81-d3ebc45a82bf.png)



適当に NAME を指定して、Generate Secret Key を押します。

- NAME : `s3 compat`

![1581848435665.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/085a1815-d531-27be-0bb3-ed1ad44faabf.png)



Key が表示されます。これは Secret Key です (画像のものは、現在無効化しています)

![1581848454945.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/d9470fc6-e3b0-0fe9-16ad-2b6bf5165ffa.png)



画面を戻すと、Access Key が表示されています。

![1581848491080.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/791a0992-04f9-42b5-d71e-c507e28a80b0.png)



# Object Storage の Endpoint 

OCI 上で次の2つの情報を確認すると、Endpoint を把握することが出来ます

- Region Identifier
- Bucket の Namespace



Region Identifier は、次の Document に書かれています

https://docs.cloud.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm

![1584623537839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/3cbce82c-66aa-a6d8-1b0f-577bfc99af84.png)



Bucket の Namespaceは、OCI Console で詳細を開くと確認できます。

![1584623605964.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/64cd0054-3dce-0104-39d2-1b631e874171.png)



これを、以下の書式にあてはめると、S3互換APIのEndpointがわかります

```
https://<Namespace>.compat.objectstorage.<Region Identifier>.oraclecloud.com
```



# Hive Connector の設定

https://prestodb.io/docs/current/connector/hive.html

Hive Connector の設定を行い、Hive Metastore や OCI Object Storage (S3互換API) を参照するための設定をします

- `hive.s3.use-instance-credentials` : IAM Role は使えないため false
- `hive.s3.aws-access-key` : `67f023eb4fe062a937922730caf4d6485c078bea`
- `hive.s3.aws-secret-key` : `tDMuNoytFCLE4ol25lW159x8582oPO2s+gBuSexnrHa=`
- `hive.s3.endpoint` : `https://nryjxkqe0mhq.compat.objectstorage.ap-tokyo-1.oraclecloud.com`
- `hive.s3.path-style-access` : true
- `hive.s3.ssl.enabled` : false

```
cat <<'EOF' > ~/presto/presto-server-0.227/etc/catalog/hive.properties
connector.name=hive-hadoop2
hive.metastore.uri=thrift://10.0.0.12:9083
hive.s3.use-instance-credentials=false
hive.s3.aws-access-key=67f023eb4fe062a937922730caf4d6485c078bea
hive.s3.aws-secret-key=tDMuNoytFCLE4ol25lW159x8582oPO2s+gBuSexnrHa=
hive.s3.endpoint=https://nryjxkqe0mhq.compat.objectstorage.ap-tokyo-1.oraclecloud.com
hive.s3.path-style-access=true
EOF
```





# Hive 側で Metastore 用サービス起動

Hive を構成しているサーバーにSSHログインして、Metastore に接続するためのサービスを起動します。いわゆる、リモートメタストアと言われる接続方式らしいです。

https://open-groove.net/hive/hive-metastore-summary/



フォアグラウンドで起動

```
$HIVE_HOME/bin/hive --service metastore
```



バックグラウンド起動

```
nohup $HIVE_HOME/bin/hive --service metastore &
```



# Hive側で、External Table の指定

次のURLに書かれている内容を、既にHive側で実施しています。実施してない場合は、実施します。

[https://qiita.com/sugimount/items/80e2b201c43856f74166#hive-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7-object-storage-%E3%81%AB%E6%8E%A5%E7%B6%9A](https://qiita.com/sugimount/items/80e2b201c43856f74166#hive-コマンドで-object-storage-に接続)

# 動作確認

それでは、Presto を使用して、S3互換のObject Storageへアクセスしてみます。まずは、presto cli を起動します。

```
~/presto/presto-server-0.227/bin/presto --server localhost:8080 --catalog hive
```



use で、`hive.<データベース名>` を指定します。

```
use hive.sugi;
```



Hive側で定義済みの External Table の定義を使用して、Select します。

```
select * from test1 limit 20;
```



実行例
次のように、Object Storage 上のデータを確認できます。

```
presto:sugi> select * from test1 limit 20;
 rank |   name   
------+----------
    1 | satou
    2 | suzuki
    3 | tanaka
    4 | sugiyama
    5 | kato
(5 rows)

Query 20200502_161051_00012_y7m8a, FINISHED, 1 node
Splits: 19 total, 19 done (100.00%)
0:00 [5 rows, 71B] [13 rows/s, 196B/s]

presto:sugi>
```





# 参考URL

https://prestodb.io/docs/current/connector/hive.html

https://qiita.com/holy_road_ss/items/511ec3f8b7fd69fd970c

https://www.alluxio.io/answers/compute/how-do-i-access-aws-s3-data-when-running-presto-in-an-on-premise-environment/

https://ja.coder.work/so/hive/837374

https://qiita.com/sikezawa/items/d3b065dd02ecfff7195b