Databricksにおける外部Hive MetastoreをMySQL（Azure Database for MySQL）にてローカルモードでSpark Configにて構築する方法

## 概要
Databricksにおける外部Hive Metastoreを、MySQL（Azure Database for MySQL）にてローカルモードでSpark Configにて構築する方法を共有します。

本手順はHive Metastoreのバージョンを`0.13.0`で構築する手順です。
databricksの内部Hive Metastoreのバージョンも`0.13.0`でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7887dd30-b208-a1e7-24b2-6be35fc11cc0.png)

Hive Metastoreのバージョンを`2.3.7`で構築したい場合には、下記の記事を参考にしてください。
- [Databricksにて外部Hive Metastore（ver:2.3.7）を構築する際にデータベースを初期化する方法について - Qiita](https://qiita.com/manabian/items/61a987aa7f9889280a42)

Azure Database for MySQLを構築後に`lower_case_table_names`を忘れずに実施してください。

- [DatabricksにてAzure Database for MySQLにてHive Metastore構築時におけるTable "columns_v2"...というエラーへの対応方法について - Qiita](https://qiita.com/manabian/items/d638e84baf6ade371d9e)

## 検証環境
databricks runtime: 8.3.x-scala2.12
Python version: 3.8.8
pyspark version: 3.1.2.dev0

## 手順
### 1. Hive Metastoreデータベース（Azure Database for MySQL）を初期化するために、Azure Database for MySQLに対して、HiveのレポジトリからダウンロードしたDDL文を実行

- https://github.com/apache/hive/blob/master/metastore/scripts/upgrade/mysql/hive-schema-0.13.0.mysql.sql

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9563707f-f176-0804-d645-1143e4d06c06.png)


下記をSparkConfに設定したクラスターにてデータベースを作成すると自動でHive Metastoreデータベースにテーブルが作成されるのですが、テーブル数が少なかったため利用しないこととしました。

```SparkConf
spark.hadoop.javax.jdo.option.ConnectionDriverName org.mariadb.jdbc.Driver
spark.hadoop.javax.jdo.option.ConnectionURL jdbc:mysql://<サーバー名>.mysql.database.azure.com:3306/<スキーマ名>?trustServerCertificate=true&useSSL=true
spark.hadoop.javax.jdo.option.ConnectionUserName <アカウント名（例：adminuser@サーバー名）>
spark.hadoop.javax.jdo.option.ConnectionPassword <パスワード>

datanucleus.autoCreateSchema true
datanucleus.fixedDatastore false
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ab7c941a-6bc6-8367-d508-bbb0682c256f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0a83e452-6ac2-1561-88bb-693f635e54bc.png)

### 2. 下記の値をSpark Configに設定してクラスターを起動

```SparkConf
spark.hadoop.javax.jdo.option.ConnectionDriverName org.mariadb.jdbc.Driver
spark.hadoop.javax.jdo.option.ConnectionURL jdbc:mysql://<サーバー名>.mysql.database.azure.com:3306/<スキーマ名>?trustServerCertificate=true&useSSL=true
spark.hadoop.javax.jdo.option.ConnectionUserName <アカウント名（例：adminuser@サーバー名）>
spark.hadoop.javax.jdo.option.ConnectionPassword <パスワード>

datanucleus.schema.autoCreateAll false
datanucleus.autoCreateSchema false
datanucleus.fixedDatastore true
datanucleus.connectionPool.minPoolSize  0
datanucleus.connectionPool.initialPoolSize 0
datanucleus.connectionPool.maxPoolSize 1
hive.stats.autogather false
mapred.reduce.tasks 100
hive.metastore.client.socket.timeout  3600
hadoop.tmp.dir /local_disk0/tmp
hive.metastore.client.connect.retry.delay 10
hive.metastore.failure.retries 30
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/95c02afa-5c68-e52a-1ac7-75fa82a949d9.png)

クラスターのターミナルにて`cat /databricks/hive/conf/hive-site.xml`により確認できるDatabricksのデフォルトのプロパティを設定しております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/820bb814-3e98-9e93-f87f-136c1d247f0d.png)

### 3. 起動したクラスターにてデータベースとテーブルが作成できることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4ff6faf6-fd5e-c26d-7af6-85464fcc7a34.png)

## その他対応
### 1. Spark ConfigにDatabricksシークレットを設定
Hvie Metastoreデータベースへのパスワード等については、Databricksシークレットから設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5a013fdb-c190-f0a3-8a03-22617a5fe599.png)

下記のドキュメントにて説明されております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6b8b2494-6b52-acca-3c16-108234f34f27.png)
引用元：[シークレット - Azure Databricks - Workspace | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/databricks/security/secrets/secrets#read-a-secret)

### 2. Hive Metastoreのパラメータについて
`0.13.0`を含む2以前のバージョンの場合には下記のドキュメントに記載されております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0502ca8a-cecf-320a-1744-b198f17c0bf4.png)
引用元：[AdminManual Metastore Administration - Apache Hive - Apache Software Foundation](https://cwiki.apache.org/confluence/display/Hive/AdminManual+Metastore+Administration)

3以降のバージョンの場合には下記のドキュメントに記載されております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bf257118-4b35-9ce7-801c-5087f02691f0.png)
引用元：[AdminManual Metastore 3.0 Administration - Apache Hive - Apache Software Foundation](https://cwiki.apache.org/confluence/display/Hive/AdminManual+Metastore+3.0+Administration)