0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Databricks運用保守入門】ジョブが失敗したときの一次切り分け手順

0
Posted at

はじめに

Databricksの運用保守を担当していると、避けて通れないのがジョブの失敗です。

しかし、ジョブが失敗したからといって、すぐにNotebookのコードが原因だとは限りません。実際には、コンピュートの起動、権限、外部ストレージ、データの形式、ライブラリなど、さまざまな場所に原因が存在します。

この記事では、Databricksのジョブが失敗したときに、運用担当者がどのような順番で確認・一次切り分けを行えばよいかを初心者向けに整理して解説します。

本記事の画面名や機能名は、Azure Databricksを前提としています。実際の対応では、組織の手順や権限設計を優先してください。


対象読者

  • Databricksの運用保守を始めたばかりの方
  • ジョブ失敗時に、どこから確認すればよいか迷っている方
  • 障害発生時の一次切り分け手順を標準化したい方

まず押さえたい考え方

一次切り分けの目的は、その場で必ず障害を解決することではありません

重要なのは、次の3点を明らかにすることです。

  1. どこで失敗したのか
  2. 何が原因として疑われるのか
  3. 誰に、どの情報を添えて引き継ぐのか

そのため、エラーを見つけて慌ててすぐに再実行するのではなく、先に実行結果やログを確実に保存・記録しておくことが大切です。


全体の切り分けフロー

ジョブが失敗した場合は、以下のステップ順に確認を進めます。

  1. 対象ジョブと実行時刻を特定する
  2. 失敗したタスクを特定する
  3. エラーメッセージとログを確認する
  4. コンピュートの起動状況を確認する
  5. 権限・認証・外部接続を確認する
  6. 入力データとテーブルの状態を確認する
  7. 過去の正常実行と比較する
  8. 再実行の可否を判断する

以下、各ステップの詳細を説明します。


1. 対象ジョブと実行時刻を特定する

最初に、調査対象のジョブと実行を明確にします。

Databricksのサイドバーから Jobs & Pipelines(または Workflows > Jobs)を開き、対象ジョブの実行履歴(Runs)を確認します。

最低限、以下の情報を記録します。

確認項目 例 / 説明
ジョブ名 daily_sales_import
Run ID 123456789
開始日時 2026-09-12 02:00 JST
終了日時 2026-09-12 02:08 JST
実行結果 Failed
実行契機 Schedule(定期実行) / 手動 / APIトリガー
通常の処理時間 約15分

タイムゾーンに注意
Databricksの画面(UTC/JST設定)、クラウド側のログ(Azure Monitor / Log Analytics等)、アラート通知メールなどでタイムゾーンが異なると、別の実行履歴を調べてしまう原因になります。必ず基準のタイムゾーンを統一して確認しましょう。


2. 失敗したタスクを特定する

複数のタスクで構成されるマルチタスクジョブでは、「ジョブ全体が失敗した」という情報だけでは不十分です。

Run details を開き、DAG(タスクグラフ)の中でどのタスクが最初に失敗したのかを確認します。

【タスク実行の流れの例】
[データ取得 (Succeeded)] 
    └─> [データ加工 (Failed!)] ※
            ├─> [集計テーブル更新 (Skipped)]
            └─> [外部サービス連携 (Skipped)]

上記のように「データ加工」が失敗した結果、後続タスクが Skipped になっている場合、最初に調査すべきは データ加工 です。Skipped になった後続タスクを調べても根本原因にはたどり着けません。

確認ポイント

  • 最初に失敗したタスクはどれか
  • 後続タスクは FailedSkipped
  • Retry(自動再試行)が行われているか
  • すべてのRetryが同じエラーで失敗しているか
  • タスク間で受け渡すパラメーターに異常がないか

3. エラーメッセージとログを確認する

失敗したタスクをクリックして開き、Output や実行ログを確認します。

このとき、最後の1行だけではなく、エラーが発生する少し手前から確認するのがコツです。最後に表示される例外は、根本原因をラップした上位のエラーであるケースが多いためです。

ログで探すべき情報

  • エラーの種類(Exceptionクラス名やエラーコード)
  • 最初にエラーが発生した正確な時刻
  • 対象のNotebook、SQL文、テーブル名、ファイルパス
  • HTTPステータスコード(4xx / 5xx系)
  • Caused by: に続く根本例外メッセージ
  • 同じエラーの繰り返し

代表的なエラーと疑うべき箇所

エラーの例 主に疑う箇所
PERMISSION_DENIED Unity Catalogの権限、Azure RBAC、マネージドID、Azure Key Vault / Secret、接続先のアクセス制御
TABLE_OR_VIEW_NOT_FOUND Catalog / Schema / テーブル名の間違い、参照先環境の相違
AnalysisException SQL構文エラー、スキーマ不一致、列名変更、データ型不一致
ModuleNotFoundError Pythonライブラリ未インストール、Databricks Runtime変更による環境差異
OutOfMemoryError (OOM) 急激なデータ量増加、非効率なクエリ/処理、コンピュートサイズ不足
429 Too Many Requests 外部APIのレートリミット(リクエスト頻度超過)
Connection timed out ネットワーク設定、NSG (Network Security Group)、Private Endpoint、接続先ダウン、DNS

4. コンピュートの起動状況を確認する

Notebookやタスクの処理が開始される前に失敗している場合は、コンピュート(クラスタ)側の問題を疑います。

確認ポイント

  • コンピュートは正常に起動したか(Running に到達したか)
  • 起動に通常より時間がかかっていないか(タイムアウトしていないか)
  • Azure側で必要なVMサイズ・コア数クォータを確保できたか(容量不足など)
  • ライブラリのインストール(PyPI/Maven等)は成功したか
  • Cluster Policy(クラスタポリシー)に違反していないか

切り分けの目安

状況 主に確認する場所
コンピュートが起動しない コンピュートの Event Log、Azure側の設定・コア数クォータ制限
起動直後にすぐ停止する Init Scriptのエラー、ライブラリの依存関係競合、ポリシー違反
Notebook開始後に失敗する Notebookセル出力、SQL実行ログ、入力データ

5. 権限・認証・外部接続を確認する

「昨日まで正常に動いていた」ジョブでも、権限やトークンの期限切れによって突然失敗することがあります。

直近で以下の変更がなかったか確認

  • 実行ユーザーや Service Principal(Microsoft Entra ID)の権限変更
  • Unity Catalog の GRANT 設定変更
  • Azure RBAC(ロール割り当て)や ADLS Gen2 / ストレージアカウントのアクセス制御変更
  • Databricks Secret / Azure Key Vault のシークレット更新・失効
  • 外部APIキーやOAuthトークンの期限切れ
  • 接続元IPアドレス制限(ファイアウォール設定)の変更
  • 接続先外部サービスやデータベースのメンテナンス・障害

ポイント
「権限エラーだからDatabricksの画面内だけを確認する」と決めつけないことが重要です。


6. 入力データとテーブルの状態を確認する

ジョブの設定やプログラムコードが変わっていなくても、取り込むデータの変化によって処理が落ちることがあります。

入力データの確認例

  • 対象ファイルが所定の場所に配置されているか
  • ファイルサイズが 0バイト(空ファイル)になっていないか
  • ファイル名やディレクトリ構成の規則が変わっていないか
  • CSV等の区切り文字や文字コード(UTF-8, Shift-JIS等)が変わっていないか
  • 想定外の新しい列が追加されていないか(スキーマドリフト)
  • 列のデータ型が変わっていないか(数値列に文字列が入った等)
  • NULL非許容の列に NULL が混入していないか
  • 上流テーブルのバッチ更新が遅延・未完了になっていないか

Delta Lakeの変更履歴を確認するSQL

Deltaテーブルを使用している場合、テーブル履歴(Time Travel機能)を確認して直前の変更を特定できます。

-- テーブルの全変更履歴を確認
DESCRIBE HISTORY catalog_name.schema_name.table_name;

-- 直近10件の変更履歴を確認
DESCRIBE HISTORY catalog_name.schema_name.table_name LIMIT 10;

実行ユーザー、操作種別(WRITE, MERGE, OPTIMIZE 等)、コミット日時を確認し、ジョブ失敗直前に予期せぬ更新がなかったかを調べます。


7. 過去の正常実行と比較する

原因の特定が難しい場合、「直近の成功したRun」と「失敗したRun」の差分を比較するのが最も効果的です。

比較対象 確認内容
コード NotebookやSQL、Gitブランチ・コミットの変更
実行設定 ジョブパラメーター、スケジュール、Retry設定の変更
コンピュート Databricks Runtime、VMサイズ(ノードタイプ)、ワーカー数
ライブラリ ライブラリの追加・更新・削除によるバージョン差異
データ 処理レコード件数、ファイル容量、スキーマ、異常値
権限 実行者、Service Principal(Microsoft Entra ID)、Azure RBAC
処理時間 どのタスク・どの処理フェーズから遅延し始めたか

「前回は成功した」という事実だけでなく、「前回から何が変わったのか」を見つけることが原因究明への最短ルートです。


8. 再実行の可否を判断する

調査を始める前に安易に再実行ボタンを押すと、原因調査に必要なエラーログが上書きされたり、データが二重計上されたりするリスクがあります。

再実行前に必ずチェックすべき項目

  • 同じ処理を複数回実行しても問題ない設計になっているか(冪等性の確認)
  • INSERT によるレコードの重複が発生しないか(MERGE や上書きになっているか)
  • 外部APIやWebhookを二重に呼び出さないか
  • メールや通知メッセージを二重送信しないか
  • 途中まで中途半端に書き込まれた一時データ・ファイルが残っていないか
  • 再実行の対象は「ジョブ全体」か「失敗したタスクのみ(Repair Run)」か
  • 後続システムや下流バッチへの影響・実行順序は大丈夫か

冪等性(べきとうせい)とは
ある操作を1回行っても複数回行っても、得られる結果が同じになる性質のことです。運用担当者が安心してリカバリできるよう、ジョブごとに「再実行時の挙動」と「リカバリ手順」をあらかじめドキュメント化しておくことが推奨されます。


運用開始前に用意しておきたいチェックリスト

障害が発生してから調査方法を調べるのではなく、平時のうちに以下の情報を整理・標準化しておくと迅速に対応できます。

  • ジョブ一覧と主担当・副担当者
  • ジョブの実行スケジュールと依存関係図
  • 平常時の標準処理時間
  • 入出力テーブル一覧と外部接続先
  • 障害通知の通知先(Slack、Teams、メール等)
  • リトライ設定(回数・間隔)のガイドライン
  • 再実行可否の判断基準(冪等性の有無)
  • エスカレーションフローと連絡体制

まとめ

Databricksジョブの一次切り分けにおける重要ステップをおさらいします。

  1. 対象の実行履歴(Run ID)を特定する
  2. DAGを確認し、最初に失敗したタスクを見つける
  3. ログから「根本原因(Caused by)」となる事実を集める
  4. コンピュート ➔ 権限 ➔ データ の順に確認する
  5. 直近の正常実行との「差分」を探す
  6. 冪等性を確認してから再実行を判断する
  7. 「事実・推測・未確認」を分けて関係者へ報告する

障害発生時に大切なのは、焦って設定を変えたり再実行を繰り返したりしないことです。
決まった手順に沿って確認を進め、原因の範囲を段階的に絞り込んでいきましょう。


参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?