Azure Data FactoryからAzure DatabricksのJobAPIを実行する

## はじめに

Azure Data Factory(以下、ADF)にはAzure Databricks上のノートブックをジョブ実行する機能がありますが、
Delta Live Tableなど、API経由でしかジョブ実行できないものがあるので、API実行のパイプラインを共有します。

## 準備

### Databricks Workspace IDの確認

1.Databricksにアクセスしてアドレスバーのここを確認、メモします。


![2022-09-22-16-16-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8fe02f0f-eda4-94ca-9904-cb62fc9c177a.png)

### Jobの作成 

1.Createします。

![2022-09-22-16-12-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/66028d24-ec75-951b-c39d-dd3107e27d60.png)


2.対象のノートブックをtaskとして登録

![2022-09-22-16-13-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/576c557c-a1be-4cbf-2851-e44b5c0e2c5d.png)


3. Job Detailsにて、Job IDを確認しておきます。

![2022-09-22-16-14-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/08afd499-09ba-0939-4e92-76d4534d9cf1.png)


### Data Factoryへの権限付与

1. 共同作成者ロールを付与します。 （[ワークスペースユーザーとしても追加する方法](https://learn.microsoft.com/ja-jp/azure/databricks/dev-tools/service-principals)もありますが、とりあえずAzure RBACで共同作成者にしておけばワークスペースの管理者になってくれるので割愛します。）
   


![2022-09-22-16-18-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f3b846e8-b706-a274-9d0a-4f5b978c0fc9.png)


## パイプラインテンプレートのインポート

1.[run_databricks_job.zip](https://github.com/ryoma-nagata/MyQiitaDocs/blob/master/AzureDatabricks/Azure%20Data%20Factory%E3%81%8B%E3%82%89Azure%20Databricks%E3%81%AEJobAPI%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B/templates/run_databricks_job.zip)からダウンロードします。

2.ADF Portal上でインポートします。


![2022-09-22-16-22-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3426d11a-34c4-578a-492b-f3aab931ea4b.png)


3.特に設定不要でインポートされます。

![2022-09-22-16-22-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/427e05f0-487b-b385-dbe6-335d49c400d8.png)



## パイプラインの内容解説

![2022-09-22-16-08-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/633e55f0-8dfb-4440-69b9-40ce3aee9d1d.png)



### パラメータ


|名前  |説明  |備考  |
|---------|---------|---------|
|DatabricksWorkspaceId     | DatabricksのワークスペースIDを入力します。        |         |
|WaitSecond     | ステータスチェックの間隔（秒）        | 既定値30秒        |
|JobId     | 実行したいjobのIDを入力します。        |         |

### Jobの実行

![2022-09-22-16-25-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a42a05fe-f8bf-49d3-21ed-bc7d0028abf8.png)

- [Jobs API](https://learn.microsoft.com/en-us/azure/databricks/dev-tools/api/2.0/jobs)を利用しています。
- POST URLにDatabricksWorkspaceIdを利用しており、対象のDatabricks Workspaceで **/2.1/jobs/run-now**　を実行しています。
  ``` expression:expression
   https://@{pipeline().parameters.DatabricksWorkspaceId}.azuredatabricks.net/api/2.1/jobs/run-now
  ```
- Bodyには、パラメータが入るようになっています。その他の制御をかけたい場合はAPIリファレンスを参照に追加可能です。
  ```exporession:expression
    {"job_id":@{pipeline().parameters.JobId}}
  ```
- MSI認証でADFからDatabricksにAPIをキックしています。
- MSI認証をするためにリソースにDatabricksのエンタープライズアプリケーションのID **2ff814a6-3304-4ab8-85cb-cd0e6f879c1d** を入力しています。
  - なお、全テナント共通のIDとなっております。  
  ![2022-09-22-16-29-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/98cfed41-f444-6d5d-50dd-5d807c3bf502.png)


### Job実行の状態チェックとUntil loop

![2022-09-22-17-17-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bd7cd26f-a9e6-1248-8836-eaf1baff910b.png)


- Until 条件は変数 **run_status** を確認しています。この変数は状態チェックにより値がセットされます。（既定はRUNNING)
  - @not(equals(variables('run_status'),'RUNNING'))
- [Jobs API](https://learn.microsoft.com/en-us/azure/databricks/dev-tools/api/2.0/jobs)を利用しています。
- GET URLにDatabricksWorkspaceIdとジョブ実行時に取得されるrun_idを利用しており、対象のDatabricks Workspaceで **2.1/jobs/runs/get?run_id={run_id}**　を実行しています。
  ``` expression:expression
   https://@{pipeline().parameters.DatabricksWorkspaceId}.azuredatabricks.net/api/2.1/jobs/runs/get?run_id=@{activity('execute_job_run').output.run_id}
  ```


### ジョブ実行失敗確認時のパイプライン失敗とエラーメッセージ

![2022-09-22-17-17-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d7dfb979-a228-cff0-30c9-4019490abf50.png)


- 変数 **run_status** がFAILEDとなったときに失敗アクティビティを実行して、パイプラインをエラー終了させます。
- エラーメッセージにはステータス確認時に取得できる実行確認ページのURLと結果メッセージを表示させます。  
``` expression:expression

Failed. 
Message: @{activity('get_run_status').output.state.state_message}
Run page URL: @{activity('get_run_status').output.run_page_url}

```

## 実行テスト

実行してみます。

![2022-09-22-17-20-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/04adbecf-b954-6250-16d3-0fb916fc0920.png)


### 正常終了


![2022-09-22-17-30-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/6ef4ce67-7ffe-2fce-1be7-f4f56f416be9.png)



各主要なアクティビティの出力を確認します

ジョブ実行API結果

![2022-09-22-17-30-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/deb2dff7-c715-dc07-dea4-c937e9aa2bfc.png)


ジョブステータス確認結果（最後）


![2022-09-22-17-43-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/dc8114ac-451e-c1e9-af34-4bdc96512c78.png)


### 異常終了


![2022-09-22-17-42-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/240cb2cf-6568-7637-5541-71ac37281c6a.png)


各主要なアクティビティの出力を確認します

ジョブ実行API結果


![2022-09-22-17-32-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/aa02f601-a191-a96a-1f47-df2db6337fb5.png)


ジョブステータス確認結果（最後）

![2022-09-22-17-43-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/6d0ae02b-6ac8-a336-5932-38bdd3512d1f.png)


エラー結果

![2022-09-22-17-44-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0c2be450-4d59-cbeb-bbdf-25f722fd70f7.png)


## 参考

https://techcommunity.microsoft.com/t5/analytics-on-azure-blog/leverage-azure-databricks-jobs-orchestration-from-azure-data/ba-p/3123862