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

## 概要
Databricksにおける外部Hive Metastoreを、Azure SQL Databaseにてローカルモードで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)


HD InsightのドキュメントにてAzure SQL DatabaseをHive Metastoreデータベースとして利用する際のサイジング方法が記載されており、DTUモデルのS2からスケールアップする方針がよいようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dfdba09b-8b55-b87e-6d00-610f1d48c9a7.png)
引用元：[外部メタデータ ストアの使用 - Azure HDInsight | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/hdinsight/hdinsight-use-external-metadata-stores#hive-metastore-guidelines)


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

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8861a8e3-300d-aa14-0853-51e698b672eb.png)



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

```SparkConf
spark.hadoop.javax.jdo.option.ConnectionDriverName com.microsoft.sqlserver.jdbc.SQLServerDriver
spark.hadoop.javax.jdo.option.ConnectionURL jdbc:sqlserver://<サーバー名>.database.windows.net:1433;database=<データベース名>
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/fd1f2d22-a2fa-00d9-a493-d27207f7aa29.png)

```SparkConf
spark.hadoop.javax.jdo.option.ConnectionDriverName com.microsoft.sqlserver.jdbc.SQLServerDriver
spark.hadoop.javax.jdo.option.ConnectionURL jdbc:sqlserver://<サーバー名>.database.windows.net:1433;database=<データベース名>
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/9daa35fa-dd70-73e8-834e-62318f2b0307.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/35c06a86-9b78-e413-7891-68f55d377122.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)