Azure DatabricksでSQL Server ODBCドライバーのインストール

# 概要

データ、分析、AIを一つのプラットフォームで提供するDatabricks、それをAzureがマネージドサービスとして提供するAzure Databricksです。
あまりも事例として使われないかもしれませんが、Azure DatabricksでSQL Server ODBCドライバーをインストールする手順についてメモします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/2c5f7183-d5cd-e5d9-be26-55895cf34705.png)

# リソース作成

Azureポータル画面からの関連リソース作成は画面が変わる可能性があるため、Azure CLIを使ってリソースを作成することとします。[Azureクラウドシェル](https://shell.azure.com/)を使うとすぐ作成できます。シェルモードはPowerShellを使うこととします。

### Azureログイン

PowerShellでAzureへログインします。単一のテナントとサブスクリプションをお持ちである場合は、一部省略できますが、下記のコマンドでどのような環境でもログインできます。

```powershell
Connect-AzAccount -UseDeviceAuthentication -TenantId "テナントID"
Select-AzSubscription -SubscriptionName "サブスクリプション名"
```

### リソースプロバイダー設定

初めてAzure Databricksリソースを作成するとまだ関連リソースプロバイダーが無効の状態である可能性がありますので、有効化します。

```powershell
az provider register --namespace 'Microsoft.Databricks'
az provider register --namespace 'Microsoft.Compute'
```

### リソースグループ作成

東日本でリソースグループを作成します。

```powershell
New-AzResourceGroup `
  -Name rg-databricks-demo `
  -Location japaneast
```

### Azure Databricksワークスペース作成

Azure Databricksを作成するにはAzure Databricks Workspaceというリソースで作成します。マネージドで管理されるため、Azure側が管理するリソースグループを追加で指定します。こちらはDatabricks内でクラスターを作成するとマネージドリソースグループ配下で作られます。
プラン(SKU)はStandardとPremiumがあり、[こちらのサイト](https://databricks.com/product/azure-pricing)で参考できます。こちらではPremiumで作成することとします。

```powershell
New-AzDatabricksWorkspace `
  -Name dbwdatabricksdemo001 `
  -ResourceGroupName rg-databricks-demo `
  -Location japaneast `
  -ManagedResourceGroupName rg-databricks-demo_databricksmanaged `
  -Sku Premium
```

完成したリソースです。ちなみに私は英語モードになっていますので、ご了承ください。

![Azure_Databricks_ODBC_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/4ff18017-5665-8e16-8f58-53a1a58060bb.png)
![Azure_Databricks_ODBC_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/eed3b0ec-2ea9-71bf-c2ca-076fcc49d153.png)

# クラスター作成

Azure Databricksワークスペース画面を開いてクラスターを作成します。ここからはウェブ画面で操作することとします。

![Azure_Databricks_ODBC_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/158bd728-fb5c-4ad0-1474-f8fe2d531e68.png)

AzureポータルからAzure Databricksワークスペースに繋がると認証が自動で行われるので、下記のようなワークスペース画面が開かれます。最初接続はパーソナライズ設定画面が現れますが、適当に選択してください。

![Azure_Databricks_ODBC_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/a9e5b51a-1a7e-5860-d4d9-f7dbecc81bac.png)

Computeメニューを選択します。

![Azure_Databricks_ODBC_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/21f29484-444e-a41a-6072-5b45a816555c.png)

Create Clusterをクリックします。

![Azure_Databricks_ODBC_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/a3bb8dcb-373b-63d8-b7cd-862b1b1dc99f.png)

クラスターの設定情報を入力します。特に重い処理をすることはないため、クラスターモードは`シングルノード`とし、ノードタイプも一番安い`Standard_F4`としました。そして`45`分使わないと自動解放するように設定しました。他にはデフォルトのままです。

![Azure_Databricks_ODBC_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/eb643cac-887e-e866-fff0-1d71d3fc8a76.png)

作られるまで待ちます。

![Azure_Databricks_ODBC_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/92e7f189-13f5-a0c4-bca9-86c36ebb0b30.png)

作られたら停止状態となるため、起動します。

![Azure_Databricks_ODBC_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/19c3759f-99aa-02ac-83bc-97fc845ada0e.png)

起動できました。

![Azure_Databricks_ODBC_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/f2635c0c-f3ba-13e6-189d-49a8d6005a12.png)

起動されたら、マネージドリソースグループ配下を見るとクラスター関連リソースが作られていることも確認できます。

![Azure_Databricks_ODBC_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/060c881a-f732-890b-7991-d0726d61335e.png)

# DBFSへ起動スクリプトファイル追加

Databricksファイルシステム(DBFS)は、Databricksワークスペースにマウントされる分散ファイルシステムです。クラスターで利用することができてクラスターが終了してもDBFSに格納されているファイルはそのまま保存されます。
詳しい内容は[データブリックス・ジャパン株式会社さんで投稿されるQiita記事](https://qiita.com/organizations/databricks)をご参考ください。
SQL Server ODBCドライバーをインストールする起動スクリプトファイルはDBFSへ作成して格納するため、ノートブックを作成します。

![Azure_Databricks_ODBC_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/52fd299b-fb79-50ce-a774-93a273de52b7.png)

![Azure_Databricks_ODBC_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/91ee1c8c-6922-5bc6-0c96-641bf80ca709.png)

スクリプト内容を以下となります。SQL Server ODBCドライバーと関連パッケージをインストールする内容となります。最新はバージョン18ですが、こちらではバージョン17を使用します。詳しい内容は[こちらのサイト](https://docs.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server)をご参照ください。

```python
dbutils.fs.mkdirs("dbfs:/databricks/scripts/")
dbutils.fs.put("/databricks/scripts/init_install_sqlserver_odbc.sh", """
#!/bin/bash
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list > /etc/apt/sources.list.d/mssql-release.list
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get -q -y install msodbcsql17
sudo apt-get -y install unixodbc-dev
""", True)
dbutils.fs.ls("dbfs:/databricks/scripts/")
```

![Azure_Databricks_ODBC_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/8e54da54-a09b-a9b1-41bd-4f75878e7c84.png)

# 起動スクリプト設定

Computeメニューに移動します。

![Azure_Databricks_ODBC_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/9f75053d-f629-4527-a1cc-b64a55eb7ed3.png)

起動スクリプトを設定するには終了状態でなければ変更できないため、クラスターを終了します。終了されたらクラスターをクリックして詳細画面に入ります。

![Azure_Databricks_ODBC_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/67de01e8-9d2c-0543-0200-966fa4ab5e21.png)

編集をクリックします。

![Azure_Databricks_ODBC_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/f386d1e2-825d-0dd3-bbc7-0b619df8407d.png)

詳細設定を開いてInit Scriptsサブメニューを選択した上で、起動スクリプトの格納先を追加して保存します。

![Azure_Databricks_ODBC_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/18721893-5b08-be5c-07c6-2cd206d96049.png)

# 動作確認

クラスターを起動します。設定した起動スクリプトの方で特に不具合など発生しない限り問題なく起動できると思います。

![Azure_Databricks_ODBC_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/f395ab04-51ff-3518-3b43-e1ce1ed7c93a.png)

PythonでODBCを使うため、パッケージをインストールします。

![Azure_Databricks_ODBC_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/83ba82ff-921c-c765-4110-0be816f6c4ae.png)

`pyodbc`を入力した上、インストールします。

![Azure_Databricks_ODBC_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/16588f1e-261b-f60b-400d-aadf1935d734.png)

インストール完了しました。

![Azure_Databricks_ODBC_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/26635583-a06f-77d1-ec17-a8bd80adb15b.png)


SQL ServerのODBCドラバー確認向けのノートブックを作成します。

![Azure_Databricks_ODBC_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/1165cf3d-726f-abf9-b05b-56685009d3b8.png)

![Azure_Databricks_ODBC_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/1350f50a-d6b9-740c-e4af-cd531f4fa913.png)

Azure SQL DatabaseまたはSQL Server仮想マシンへ接続確認を行います。

```python
import pyodbc
sql_connect_string="Driver={ODBC Driver 17 for SQL Server};SERVER=tcp:SERVERADDRESS,1433;Database=DATABASE;Uid=USERNAME;Pwd=PASSWORD;Encrypt=yes;TrustServerCertificate=no;ConnectionTimeout=30;"
with pyodbc.connect(sql_connect_string) as conn:
    with conn.cursor() as cursor:
        cursor.execute(f"SELECT 'Hello World!'")
```

![Azure_Databricks_ODBC_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/8336161f-8309-6768-3eae-c0ba316e9440.png)

# まとめ

SQL Server ODBCドライバーをインストール手順をご紹介だったですが、他のDBFSへ起動スクリプト設定の方法などご活用できます。
Azure IoT Edge専門で関連内容を投稿していますが、テレメトリーデータを分析するため関連内容も紹介して参りたいと思います。