Databricks にて dbutils.notebook.run 実行時のエラー調査方法

## 概要

Databricks にて処理の共通化を実施するために dbutils.notebook.run により他のノートブックを実行することがあるのですが、実行先のノートブックでエラーが発生した際の調査手順を紹介します。

実行先のノートブックでエラーが発生する際には下記のようなエラーが発生します。エラーが発生した際のこのスクリーンショットやエラーメッセージを送付されることがありますが、エラー原因が書かれていないため調査ができません。

```text
Py4JJavaError: An error occurred while calling o417.run.
: com.databricks.WorkflowException: com.databricks.NotebookExecutionException: FAILED: Workload failed, see run output for details
	at com.databricks.workflow.WorkflowDriver.run(WorkflowDriver.scala:99)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bddc4286-c81c-2008-25eb-90cafdac1343.png)

エラーとなったノートブックの`Start time`の時刻を選択して、実行先のノートブックの実行結果を表示してエラーメッセージを確認する必要があります。下記エラーメッセージでは、int 関数に渡された文字が不適切であるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6dacd1c8-6efc-6ab7-2963-395c0e949e46.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6d12a748-37b2-2ba7-efd3-9c8b8935be58.png)

本記事では、ノートブックを作成し、エラーを発生後にそのエラーを修正する手順まで紹介します。

`dbutils.notebook.run`による処理の共通化については下記の記事で紹介しています。

- [Databricks にて json 文字列をパラメータで渡すことによるノートブック実行処理の共通化 #Spark - Qiita](https://qiita.com/manabian/items/53f4461b31b1048dc894)

## 事前準備

### 1. 実行先ノートブックを`executor_notebook_01`という名称で作成して、下記のコードを記述

```python
# Widget を定義
dbutils.widgets.text("input_value", "1")
input_value = dbutils.widgets.get("input_value")
```

```python
# Widget から取得した値を数値型に変換
input_value_to_int = int(input_value)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f6a6f8c3-8f31-bb2a-1046-78667dc8d347.png)
 
### 2. 同一のディレクトリに、実行元ノートブックを`runner_noteboke_01`という名称で作成して、下記のコードを記述

```python
nb_path = "executor_notebook_01"
nb_para = {
    "input_value": "a",
}
timeout = 0
```

```python
dbutils.notebook.run(nb_path, timeout, nb_para)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5d244455-a5e2-2cab-67a5-fe874e91390e.png)

## エラーの再現と対応方法

### 1. エラーを再現

##### 1-1. 実行元ノートブックである`runner_noteboke_01`を実行してエラーとなることを確認

```text
Py4JJavaError: An error occurred while calling o412.run.
: com.databricks.WorkflowException: com.databricks.NotebookExecutionException: FAILED: Workload failed, see run output for details
	at com.databricks.workflow.WorkflowDriver.run(WorkflowDriver.scala:99)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5971362f-a0ec-c62a-f8db-de790ba0a259.png)

```text
ValueError: invalid literal for int() with base 10: 'a'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/354c4fe3-d398-87c3-163c-0947600f4448.png)

### 2. エラーへの対応方法

#### 2-1. 実行元ノートブックである`runner_noteboke_01`内の`input_value`の値を`100`に変更

```diff_python
nb_path = "executor_notebook_01"
nb_para = {
-    "input_value": "a",
+    "input_value": "100",
}
timeout = 0
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0a5f5737-f99d-3468-7ce7-afe63bcc0344.png)

#### 2-2. 実行元ノートブックを実行して正常終了することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a6d881ad-788e-6f26-e805-f7ee3380ffb0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b529dd7e-fdaf-d520-2caf-3fb94491ea94.png)