DatabricksワークフローとジョブとDelta Live Tablesの関係性

自分もはじめはうまく理解できていなかったので、改めてここで整理します。まず、サマリーから書きます。
![Screenshot 2023-10-19 at 17.03.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5aa4c841-a848-f3cd-9d99-bbde955a0ae5.png)


- Databricksでオーケストレーションを一手に担っているのがDatabricksワークフローで、ワークフローにはDatabricksジョブとDelta Live Tablesが含まれています。ワークフロー自体は概念を指す言葉なので、実際の機能はDatabricksジョブとDelta Live Tables(DLT)が提供しています。
- Databricksジョブではマルチタスクをサポートしており、タスクとしてはノートブックや**Delta Live Tablesのパイプラインを実行する**ことができます。
- Delta Live Tablesはデータパイプラインを構築・運用するためのフレームワークであり、少ないコーディングで高信頼・高パフォーマンスのパイプラインを構築することができます。

| 機能 | 用途 | 処理対象 |
|:--|:--|:--|
| Databricksジョブ  | マルチタスクのオーケストレーション  |  Databricks上の資産(ノートブック、SQLクエリー、Delta Live Tablesパイプライン、ダッシュボードなど) |
| Delta Live Tables  | データパイプラインの構築・運用  | Delta Lakeテーブル  |


# Databricksワークフローとは

https://www.databricks.com/jp/product/workflows

Databricksワークフローは、Databricksのマネージドオーケストレーションサービスを意味します。実態としては、以下の2つの機能から構成されています。ワークフロー自体の機能は現時点では存在しておらず、以下の2つを包含する概念と理解していただくのがよろしいかと思います。

- [Databricksジョブ](#databricksジョブとは)
- [Delta Live Tables](#delta-live-tablesとは)

# Databricksジョブとは

https://docs.databricks.com/ja/workflows/jobs/create-run-jobs.html

Databricksジョブは、ノートブックのようなインタラクティブな方法で処理を行うのではなく、スケジュール実行、トリガー実行など人間を介さない形で処理を実行するための機能を提供するジョブスケジューラです。マルチタスクをサポートしており、ノートブック、SQLクエリー、Delta Live Tablesパイプラインなどの[タスク](https://docs.databricks.com/ja/workflows/jobs/create-run-jobs.html#task-type-options)を組み合わせてジョブを実行することができます。条件分岐をサポートしており[処理の並列化](https://www.databricks.com/jp/blog/2023/08/07/databricks-workflow-new-features)などで活用することができます。

# Delta Live Tablesとは

https://www.databricks.com/jp/product/delta-live-tables

Databricksでのデータパイプラインの構築を容易にするフレームワークです。SQLあるいはPythonでデータパイプラインの各ステップを宣言していただくだけで、複雑なパイプラインを容易に構築することが可能です。この他にもエラー時の対応、イベントログの取得、自動テストなどデータパイプラインの運用に不可欠な機能を提供しているので、データエンジニアの方はパイプラインのロジックの構築にフォーカスすることができます。

# DatabricksジョブとDelta Live Tablesの組み合わせパターン

1. Delta Live Tablesを用いて、S3に到着する新規ファイルを自動で取り込み、クレンジングや集計を行うデータパイプラインを開発します。
![Screenshot 2023-10-19 at 17.06.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d7fca86c-e5b2-ea0b-acb0-65a13b61c6c9.png)
1. パイプラインを実行してデバッグを行います。この際には**開発**モードを使用します。[開発モード](https://docs.databricks.com/ja/delta-live-tables/updates.html#development-and-production-modes)の場合、パイプラインが失敗しても自動リトライが実行されないので、繰り返しの開発が容易になります。また、クラスターも処理完了後に即時には停止しません。プロダクションモードの場合は、自動リトライが実行され、パイプライン終了後即座にクラスターが停止します。パイプラインの動作が確認できたら、プロダクションモードに切り替えます。
![Screenshot 2023-10-19 at 16.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0bf77b58-4742-ab6d-6c4a-d19fdb2ffc46.png)
1. テーブルの存在確認を行うなど前処理のSQLクエリーを作成します。
1. Databricksジョブを作成します。最初のタスクでは上で作成したクエリーを実行するようにします。
![Screenshot 2023-10-19 at 17.12.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/431ea80f-f4de-9290-bc63-70114fdecf5d.png)
1. 以下の例では、存在確認が失敗した場合、すなわち、テーブルが存在しない場合にはDelta Live Tablesパイプラインを実行します。
![Screenshot 2023-10-19 at 17.12.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f3a85522-9599-3129-4603-a5f2a3e76a7d.png)
1. 存在確認が成功した場合、すなわち、テーブルが存在する際にはテーブルを削除した後に、Delta Live Tablesパイプラインを実行します。
![Screenshot 2023-10-19 at 17.12.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2481efc7-11a1-19c6-5eee-a66efbc1b5c0.png)
1. マルチタスクの各ステップの成功・失敗は**ジョブの実行**から確認することができます。
![Screenshot 2023-10-19 at 17.15.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/db2aca5b-a59b-dc94-9959-95b83b65cc2b.png)

このジョブをスケジュール実行あるいはファイル到着を契機として実行することができます。また、上で示したように、即時実行するケースにおいても、複雑な処理をまとめ上げたいという用途でもご活用いただけます。
![Screenshot 2023-10-19 at 17.16.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/77725829-512d-1825-620b-10aaa251f905.png)
![Screenshot 2023-10-19 at 17.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/367faef8-d6db-1608-6d5d-05d45ef04157.png)

非常に強力なツールですので、是非ご活用ください！

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)