IBM Analytics Engine Sparkからwatsonx.data を操作: 「2. IBM Analytics Engine Spark の構成」

watsonx.data では、以下のユースケースを実現するために IBM Analytics Engine Spark を使用することが推奨されています。

1. 大量のデータのwatsonx.dataテーブルへの取り込み(取り込み前にデータをクレンジングして変換可能)
1. watsonx.data テーブルのパフォーマンス向上のためのテーブルのメンテナンス操作
1. クエリとして表現するのが難しい複雑な分析ワークロード

「IBM Analytics Engine Sparkからwatsonx.data を操作」ではpythonを使ってwatsonx.dataのテーブルをIBM Analytics Engine instance(Spark)でアクセスする方法について説明します。**環境はIBM Cloudです。**

**IBM Analytics Engine Sparkからwatsonx.data を操作**
以下の順序で説明します。この記事は「2. IBM Analytics Engine Spark の構成」です。


[1. IBM Analytics Engine Spark インスタンスの作成](https://qiita.com/nishikyon/items/fdaf99066cece2b10ac8)
2. **IBM Analytics Engine Spark の構成**
[3. Sparkによる処理](https://qiita.com/nishikyon/items/732a9c1e56de7560356c)

下の図が全体像です。この記事は①が②にアクセスするための設定を行います。
[図1: 全体像]
![qiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/7ed79efb-2888-ea76-424e-51e584a14c4c.jpeg)


尚、この内容は公式ドキュメント[Configuring Analytics Engine instance](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-lh-config-ae)に書かれている内容を環境に合わせる部分を追加して説明しているものです。

# 0. 前提
- IBM watsonx.dataのインスタンスがあること 
- IBM Analytics Engineのインスタンス があること
  - ない場合は「[1. IBM Analytics Engine Spark インスタンスの作成](https://qiita.com/nishikyon/items/fdaf99066cece2b10ac8)」を参考に作成してください。
- オブジェクトストレージ（バケット)が1つ以上カタログ・タイプ「Apache Iceberg」でIBM watsonx.dataに登録済みであること(図1の②があること)


# 1. [前準備1]  HiveメタストアURL(HMS URL)とカタログ名の取得
参考: [Retrieving Hive metastore(HMS) credentials](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-hms#hms_url)

1. watsonx.data コンソールにログインします。
2. ナビゲーションメニューから、インフラストラクチャーマネージャーを選択します。
3. Sparkから操作したいwatsonx.data上のバケットと紐づくカタログをクリックします。
尚、**カタログ・タイプは「Apache Iceberg」のものを選んでください。**
(Apache Hiveは後の「Sparkによる処理」がいろいろソースを変更してもうまくいきませんでした。もしかしたらやり方があるかもしれませんが、判明しませんでしたのて当シリーズは「Apache Iceberg」に限定します。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/1baa7a35-4074-b948-41cd-e07672c8e893.png)


4. メタストア・ホストと名前ををコピーし、どこかに貼っておきます。
「メタストア・ホスト」が「HMS　URL（thrift url）」です。
「名前」が「カタログ名」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/39d1d1ed-fe29-7dd1-48b5-f8524d76f0dc.png)


# 2. [前準備2]  watsonx.data API KEYの取得
以下の方法でAPIKEYを取得してください
- [IBM Cloudのwatsonx.dataにアクセス可能なAPIKEYをサービスIDから作成](https://qiita.com/nishikyon/items/e42913a63d5f4c5380a8)

# 3. Analytics Engineインスタンスの設定
### 1. IBM Cloudにログインし,リソースリストを表示します。
https://cloud.ibm.com/resources
(ログインしていない場合はログイン画面の後、リソースリスト画面になります)
### 2. 「分析」セクションにあるAnalytics Engineインスタンスの名前をクリックして詳細を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/e5326ce1-a9b2-773d-3c18-342ab427aee7.png)

### 3. 「管理」 > 「構成」タブ をクリックして構成を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9830c9ff-558a-0a03-ed6c-f4ad562d3c88.png)

### 4. スクロールして一番下にある「デフォルトの Spark 構成」セクションで、[Edit] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/5caf88e5-991c-1ae3-9bd0-0fe00ae88881.png)


### 5. 次の構成をDefault Spark構成セクションに追加します。
以下のパラメータは自分のに情報に変更します。

- Hms-thrift-endpoint-from-watsonx.Data: 前準備1で取得したHMS URL, 先頭に`thrift://`を付加
- Hms-user-from-watsonx.Data: APIKEYを使用するので`ibmlhapikey`固定値
- Hms-password-from-watsonx.Data: 前準備2で取得したAPIKEY
- <カタログ名>は前準備1で取得したカタログ名に変更します(3カ所)
   - spark.sql.catalog.**<カタログ名>**
   - spark.sql.catalog.**<カタログ名>**.type
   - spark.sql.catalog.**<カタログ名>**.uri
   - 
   - 例: カタログ名が`nishito_iceberg`の場合
      - spark.sql.catalog.**nishito_iceberg** = org.apache.iceberg.spark.SparkCatalog
      - spark.sql.catalog.**nishito_iceberg**.type = hive
      -  spark.sql.catalog.**nishito_iceberg**.uri = thrift://xxx.xxx.xxx.xxx:nnnn
      -  


    - 尚、もし使用したいカタログが複数ある場合は複数記載しても問題ありません。
    - カタログ名が`xxxx_iceberg`と　`yyyy_iceberg`の場合:
      - spark.sql.catalog.**xxxx_iceberg** = org.apache.iceberg.spark.SparkCatalog
      - spark.sql.catalog.**xxxx_iceberg**.type = hive
      -  spark.sql.catalog.**xxxx_iceberg**.uri = thrift://xxx.xxx.xxx.xxx:nnnn
      -  spark.sql.catalog.**yyyy_iceberg** = org.apache.iceberg.spark.SparkCatalog
      - spark.sql.catalog.**yyyy_iceberg**.type = hive
      -  spark.sql.catalog.**yyyy_iceberg**.uri = thrift://xxx.xxx.xxx.xxx:nnnn
```ini
spark.sql.catalogImplementation = hive
spark.driver.extraClassPath = /opt/ibm/connectors/iceberg-lakehouse/iceberg-3.3.2-1.2.1-hms-4.0.0-shaded.jar
spark.sql.extensions = org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.sql.iceberg.vectorization.enabled = false
spark.sql.catalog.<カタログ名> = org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.<カタログ名>.type = hive
spark.sql.catalog.<カタログ名>.uri = <前準備1で取得したHMS URL, 先頭に`thrift://`を付加> 例： thrift://81823aaf-8a88-4bee-a0a1-6e76a42dc833.cfjag3sf0s5o87astjo0.databases.appdomain.cloud:32683
spark.hive.metastore.client.auth.mode = PLAIN
spark.hive.metastore.client.plain.username = ibmlhapikey
spark.hive.metastore.client.plain.password = <前準備2で取得したAPIKEY>
spark.hive.metastore.use.SSL = true
spark.hive.metastore.truststore.type = JKS
spark.hive.metastore.truststore.path = file:///opt/ibm/jdk/lib/security/cacerts
spark.hive.metastore.truststore.password = changeit
```

セットしたら、「保存」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/33894233-9f31-2dea-c679-08955a93571e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/78735256-2b1f-42dc-b6d2-db5fdc75ede9.png)



これでIBM Analytics Engine Spark の構成が完了しました!

# NEXT
「[3. Sparkによる処理](https://qiita.com/nishikyon/items/732a9c1e56de7560356c)」に進みましょう!