#1 Azure Databricks を使ってみよう 【環境準備編】


## 【 Azure Databricks ETL編 その１ 】

### 概要
Azure Databricks を使ってみよう！　ということで、以下の３ステップで簡単に說明します。
  1. [【環境準備編】](https://qiita.com/turupon/items/5a5782a62c24ccb3b3b5)：Azure CLI から Azure Databricks 環境を作成します
  2. [【抽出変換編】](https://qiita.com/turupon/items/21e2ca80ca497886d99d)：Databricks から ADLS Gen2 のデータを抽出し、変換します
  3. [【格納編】](https://qiita.com/turupon/items/50f3e12222fa2f7d4144)：Databricks で ETL されたデータを ADLS Gen2 に格納します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/4552ecd5-3313-3beb-25bd-08beb5322d70.png)

今回は 【環境準備編】の說明となります

  - Azure DataLake Storage Gen2
    - ストレージアカウント作成
    - データアップロード用コンテナ作成
    - ETL後のデータ格納用コンテナ作成
  - データの準備
    - Gen2 のデータアップロード用コンテナにローカルにあるファイルをアップロード 
  - Azure Databricks
    - workspace作成
    - トークン認証

### ローカル環境

- macOS Big Sur 11.3 
- python 3.8.3
- Azure CLI 2.28.0

### 前提条件

1. Azure環境がすでに用意されていること（テナント/サブスクリプション）。
2. ローカル環境に「azure cli」がインストールされていること。

---

## 事前準備

### Azure CLI の機能拡張

```
## 最新の databricks CLI バージョンを使用する拡張機能をインストールします
$ az extension add -n databricks

## Azure CLI の確認
$ az version
{
  "azure-cli": "2.28.0",
  "azure-cli-core": "2.28.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {
    "azure-iot": "0.10.13",
    "databricks": "0.7.3",
    "kusto": "0.3.0",
    "stack-hci": "0.1.4"
  }
}

## databricks-cli のインストール設定
$ pip install databricks-cli
```

### Azure 環境の準備

```
### ローカル環境変数の定義
export RG_NAME=rg-ituru_bricks01
export SUBS_NAME=PSP2-01
export STORAGE_ACCOUNT=testaccount
export STORAGE_CONTAINER=cost-data
export ETL_CONTAINER=etl-cost-data
export DB_WORKSPACE_NAME=db-ituru_workspace01

## 使用するテナントへのログイン
$ az login --tenant <tenant_id>

## 使用サブスクリプションの定義
$ az account set --subscription $SUBS_NAME

## 使用サブスクリプションの確認（IsDefault=True）
$ az account list --output table

## サブスクリプションのリソースIDを取得
$ SUBS_ID=$(az account show --query "id" --output tsv)

## Azure Data Bricks 用のリソースグループ作成
$ az group create --name $RG_NAME --location japaneast
```

### ローカル環境の作業ディレクトリ

UploadCostData ディレクトリ配下のファイルは、[この記事](https://qiita.com/turupon/items/f9a36fc33d8d613d7d3f) で取得したAzure使用料金のデータです

```
## UploadCostData ディレクトリ配下のファイルを今回の対象データとします
$ tree -a                 
.
└── UploadCostData
    ├── UsageCost_NSG-01_20210929_115527.json
    └── UsageCost_iapp-01_20210929_115558.json
```

---

## 環境の構築

### Gen2 の　Storage　Account の作成

```
## ストレージアカウントの作成
$ az storage account create --name $STORAGE_ACCOUNT --resource-group $RG_NAME -l japaneast --sku Standard_LRS --enable-hierarchical-namespace true

## 使用するコンテナの作成
### データアップロード用
$ az storage container create --name $STORAGE_CONTAINER --account-name $STORAGE_ACCOUNT
### ETL用
$ az storage container create --name $ETL_CONTAINER --account-name $STORAGE_ACCOUNT

## ストレージアカウントの認証情報の取得
$ az storage account keys list --account-name $STORAGE_ACCOUNT --subscription $SUBS_NAME --resource-group $RG_NAME --output table
CreationTime                      KeyName    Permissions    Value
--------------------------------  ---------  -------------  -----------------------------
2021-10-15T20:17:11.969418+00:00  key1       FULL           xxxxxxxxxxxxxxxxxxxxxxxxxxxx
2021-10-15T20:17:11.969418+00:00  key2       FULL           yyyyyyyyyyyyyyyyyyyyyyyyyyyy
```

Azure Portal で確認すると、以下の表示となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/038d0d4f-38fd-87e2-8f18-e99dac487142.png)


### データのアップロード

```
## アップロードパス・ディレクトリ から コンテナーにすべてのファイルをアップロードします
$ az storage blob upload-batch --account-name $STORAGE_ACCOUNT -d $STORAGE_CONTAINER -s ./UploadCostData/*.json
Finished[#############################################################]  100.0000%
[
  {
    "Blob": "https://testaccount.blob.core.windows.net/cost-data/UsageCost_iapp-01_20210929_115500.json",
    "Last Modified": "2021-10-24T15:14:35+00:00",
    "Type": "application/json",
    "eTag": "\"0x8D99700FD813F9C\""
  },
  {
    "Blob": "https://testaccount.blob.core.windows.net/cost-data/UsageCost_NSG-01_20210929_115617.json",
    "Last Modified": "2021-10-24T15:14:35+00:00",
    "Type": "application/json",
    "eTag": "\"0x8D99700FD86305B\""
  }
]

## コンテナー内の BLOB を一覧表示する
$ az storage blob list --account-name $STORAGE_ACCOUNT --container-name $STORAGE_CONTAINER --output table
Name                                    Blob Type    Blob Tier    Length    Content Type      Last Modified              Snapshot
--------------------------------------  -----------  -----------  --------  ----------------  -------------------------  ----------
UsageCost_NSG-01_20210929_115617.json   BlockBlob    Hot          14822     application/json  2021-10-24T15:14:35+00:00
UsageCost_iapp-01_20210929_115500.json  BlockBlob    Hot          10807     application/json  2021-10-24T15:14:35+00:00
```

### Azure Data Bricks の作成

14日間無料のトライアル版で構成します

```
## Azure Databricks Workspace の作成・・・完了まで数分かかります
az databricks workspace create --resource-group $RG_NAME --name $DB_WORKSPACE_NAME --location japaneast --sku trial

## 作成した WorkspaceURL の取得
$ WS_URL=$(az databricks workspace show --resource-group $RG_NAME --name $DB_WORKSPACE_NAME --query "workspaceUrl" --output tsv)
$ echo $WS_URL 
adb-333338888844444.28.azuredatabricks.net
```

### Azure Databricks 個人用アクセストークンを使用して認証する

Azure Portal で上記で作成した Databricks サービスに移動し、「ワークスペースの起動」ボタンを押し、Azure Databricks ポータル画面を表示させます。

#### GUI からのトークン作成（初回作成は必ずGUIから行なう）

表示された画面の左側にある「Settings」ー「User Settings」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/36914a6d-2b78-eff7-4b38-0c6a226d1df3.png)

新たに表示された画面から「Generate New Token」ボタン押す　⇒　次の画面で以下の値を設定し「Generate」ボタンを押す

| 項目 | 値 |
| ---- | --- |
| Comment | TEST_20211025 |
| Lifetime (days) | 14 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/16c851c7-f030-ea62-4a80-9c5be186e647.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/d53d6750-b7a6-86cb-84b4-db883f0927e1.png)


作成されたトークンを環境変数に定義します

```
$ export TOKEN=dapi44444444333333332222222211111111
```

#### CLI からのトークン作成（２個目（２回目）以降はCLIからの作成が可能）

```
####（トークンに指定する有効期限：36時間（129600秒), 10日間（864000秒), 15日間（1296000秒)）
https://docs.microsoft.com/ja-jp/azure/databricks/dev-tools/cli/tokens-cli

$ TOKEN=$(databricks tokens create --lifetime-seconds 1296000 --comment "Test_20211125" | jq .token_value --raw-output)
$ echo $TOKEN 
dapi55555555666666667777777788888888
```

### トークンを使用して認証する

```
$ export DATABRICKS_AAD_TOKEN=$TOKEN
$ databricks configure --aad-token
Databricks Host (should begin with https://): https://adb-333338888844444.28.azuredatabricks.net

## 認証情報の確認（~/.databrickscfg ファイルを確認）
[DEFAULT]
host = https://adb-333338888844444.28.azuredatabricks.net
token = dapi44444444333333332222222211111111

## 複数の接続プロファイルを定義する場合
$ databricks configure --aad-token --profile 'AUC01'

## 認証情報の確認（~/.databrickscfg ファイルを確認）
[AUC01]
host = https://adb-333338888844444.28.azuredatabricks.net
token = dapi55555555666666667777777788888888

# 動作確認
$ databricks fs ls
```

### Azure Data Bricks リソースのクリーンアップ

```
## リソースをクリーンアップするには、ワークスペースを削除します
az databricks workspace delete --resource-group $RG_NAME --name $DB_WORKSPACE_NAME
```

---

### まとめ

Azure CLI と Azure Databricks Portal を使用した環境構築でした、、、