Databricks で CI/CD !Databricks Asset Bundles しよ!
最近ファミレス行こ!を読んだので影響をうけています
Databricks Asset Bundles がGAしました!
最近DatabricksをCLIでデプロイ、実行などのコントロールができるDatabricks Asset BundlesがGAしました!
そんななか、、、ぼくは思ったわけです、、、Databricks Asset Bundles、、、便利なんだけど出たばっかりなのもあってイマイチ知られていないとw
なので入門記事を書くことにしました!
Databricks Asset Bundles の概要
これは上のBlogを見ていただくとわかるのですが、簡単に説明すると、Bundleという形でJob、Taskのデプロイや、Jobの実行などをCLIで行う事ができ、コードの形で管理することが可能です。CLIで実行することが可能なので、Github ActionなどでCI/CDを行うことも可能ですし、Visual Studio CodeからJobを実行することもでき、開発体験の向上が期待できるプロダクトになっています。
Databricks Asset Bundles 構築の流れ
Databricks Asset Bundles プロジェクトの作成
まず、Databricks Asset Bundles(長いのでここからはDABって書きます)のファイルを置くためのディレクトリを用意します。
$ mkdir dab_sample
$ cd dab_sample
次に、プロジェクトの初期化をします。 databricks bundle init を実行します。
最初に、 ~/.databrickscfg の中のプロファイルから使えるDatabricksの環境を選択します。ここではhogehoge(実際にはないですw)を選択します。
$ databricks bundle init
Search: █
Workspace profiles defined in ~/.databrickscfg
hogehoge (https://hogehoge.cloud.databricks.com/)
fugafuga
次に、テンプレートを選択します、今回はML関連のないシンプルな default-python で。
Template to use:
▸ default-python
mlops-stacks
そうして順に答えていきます、プロジェクト名を sample_project に。
Welcome to the default Python template for Databricks Asset Bundles!
Please provide the following details to tailor the template to your preferences.
Unique name for this project [my_project]: sample_project
notebookの置き場所を sample_project/src (デフォルト)に。
Unique name for this project [my_project]: sample_project
Include a stub (sample) notebook in 'sample_project/src':
▸ yes
no
おなじように、Delta Live Table pipelineの置き場も同様に sample_project/src に。
Unique name for this project [my_project]: sample_project
Include a stub (sample) notebook in 'sample_project/src': yes
Include a stub (sample) Delta Live Tables pipeline in 'sample_project/src':
▸ yes
no
Pythonのパッケージ置き場も sample_project/src にします、これは変えたければ後で変えることもできるので今回はそのままで行きます。
Unique name for this project [my_project]: sample_project
Include a stub (sample) notebook in 'sample_project/src': yes
Include a stub (sample) Delta Live Tables pipeline in 'sample_project/src': yes
Include a stub (sample) Python package in 'sample_project/src':
▸ yes
no
最後にデプロイ先の Databricks 環境を指定する databricks.yml の場所をsample_project/databricks.ymlに指定して初期設定を完了します!
Unique name for this project [my_project]: sample_project
Include a stub (sample) notebook in 'sample_project/src': yes
Include a stub (sample) Delta Live Tables pipeline in 'sample_project/src': yes
Include a stub (sample) Python package in 'sample_project/src': yes
Workspace to use (auto-detected, edit in 'sample_project/databricks.yml'): https://hogehoge.cloud.databricks.com
✨ Your new project has been created in the 'sample_project' directory!
Please refer to the README.md file for "getting started" instructions.
See also the documentation at https://docs.databricks.com/dev-tools/bundles/index.html.
これでDABを使う準備ができました!
Databricks Asset Bundles プロジェクトのファイルたち
ここから最低限動かすために触っていくファイルたちについて触れていきます。
ディレクトリ構成
DABのディレクトリ構成は以下の様になっています。
sample_project - directory root
|--.gitignore
|--.vscode - Visual Studio Code用設定ファイル
| |--__builtins__.pyi
| |--extensions.json
| |--settings.json
|--README.md
|--databricks.yml - デプロイ先の Databricks 環境を指定
|--fixtures - パス取得などDABのなかで使うCSVなどを入れておく場所
| |--.gitkeep
|--pytest.ini
|--requirements-dev.txt
|--resources - Job用のYamlを入れておく場所
| |--sample_project_job.yml
| |--sample_project_pipeline.yml
|--scratch - 個人的なノートブック用で、デフォルトでは、'scratch'が.gitignoreに書いてあり、Gitにコミットされない
| |--README.md
| |--exploration.ipynb
|--setup.py
|--src - JobやNotebookなどのソースを入れる場所
| |--dlt_pipeline.ipynb
| |--notebook.ipynb
| |--sample_project
| | |--__init__.py
| | |--main.py
|--tests - testコードを入れる場所
| |--main_test.py
databricks.yml
databricks.yml は、デプロイ先の Databricks 環境や、DABの基本設定を入れておくファイルになります。
# プロジェクト名
bundle:
name: sample_project
# Jobのインクルードパスの設定
include:
- resources/*.yml
# デプロイターゲット
targets:
# 開発用に使われる"dev"何も指定しない場合はこれが使われます
dev:
mode: development
default: true
workspace:
host: https://hogehoge.cloud.databricks.com
# 本番用に使われる"prod"
prod:
mode: production
workspace:
host: https://prod-hogehoge.cloud.databricks.com
root_path: /Shared/.bundle/prod/${bundle.name}
run_as:
user_name: kuwano@example.com
src配下
src配下にはデプロイしたい、Taskや、Delta Live Table に使うNotebookや、dbtのSQLファイルを置いて置いておくとリリースの成果物としてデプロイ時にDatabricks側に送られます。
requirements-dev.txt
Pythonライブラリの管理用のファイル、pipのrequirements.txtの書式で書けばOK
## pytest is the default package used for testing
pytest
## Dependencies for building wheel files
setuptools
wheel
resources/sample_project_job.yml
Jobの設定ファイル、デフォルトの名前はこれなだけで、databricks.ymlで設定している通り、resources/*.ymlであれば読み込まれる、複数あれば複数のJobが作成されます。
Jobには通常のNotebookのTaskや、Delta Live Table 、dbt coreなどを含めて実行することが可能です。
resources:
# ジョブの設定
jobs:
sample_project_job:
name: sample_project_job
schedule:
quartz_cron_expression: '44 37 8 * * ?'
timezone_id: Europe/Amsterdam
email_notifications:
on_failure:
- kuwano@example.com
# ジョブの中で動く各タスクの設定
tasks:
- task_key: notebook_task
job_cluster_key: job_cluster
notebook_task:
notebook_path: ../src/notebook.ipynb
- task_key: refresh_pipeline
depends_on:
- task_key: notebook_task
pipeline_task:
pipeline_id: ${resources.pipelines.sample_project_pipeline.id}
- task_key: main_task
depends_on:
- task_key: refresh_pipeline
job_cluster_key: job_cluster
python_wheel_task:
package_name: sample_project
entry_point: main
# デフォルトはsample_projectパッケージ用に生成された.whlファイルをインクルードする。 https://docs.databricks.com/dev-tools/bundles/library-dependencies.html を参照
libraries:
- whl: ../dist/*.whl
# ジョブを実行するクラスタの設定
job_clusters:
- job_cluster_key: job_cluster
new_cluster:
spark_version: 13.3.x-scala2.12
node_type_id: i3.xlarge
autoscale:
min_workers: 1
max_workers: 4
resources/sample_project_pipeline.yml
Delta Live Table パイプラインの設定
# The main pipeline for sample_project
resources:
pipelines:
sample_project_pipeline:
name: sample_project_pipeline
target: sample_project_${bundle.environment}
libraries:
- notebook:
path: ../src/dlt_pipeline.ipynb
configuration:
bundle.sourcePath: /Workspace/${workspace.file_path}/src
Databricks Asset Bundle Jobのデプロイ
databricks bundle deploy コマンドを使ってDatabricks環境にJobをデプロイします
$ databricks bundle deploy -t dev
Building sample_project...
Uploading sample_project-0.0.1+20240503.124216-py3-none-any.whl...
Uploading bundle files to /Users/kuwano@example.com/.bundle/sample_project/dev/files...
Deploying resources...
Updating deployment state...
Deployment complete!
コマンド実行後には、distディレクトリ以下にPythonのwhlファイルや、.databricksディレクトリ以下に必要なTerraformファイルなどのデプロイ用のファイルが生成されます
Databricks Asset Bundle Jobの実行
次はJobの実行です。 databricks bundle run -t [ターゲット] [ジョブ名] で実行可能です。
$ databricks bundle run -t dev sample_project_job
Run URL: https://hogehoge.cloud.databricks.com/?o=1890840759133109#job/576353602245497/run/938262910162061
2024-05-04 00:16:50 "[dev akihiro_kuwano_011] sample_project_job" RUNNING
2024-05-04 00:25:52 "[dev akihiro_kuwano_011] sample_project_job" TERMINATED SUCCESS
Output:
=======
Task notebook_task:
=======
Task main_task:
+--------------------+---------------------+-------------+-----------+----------+-----------+
|tpep_pickup_datetime|tpep_dropoff_datetime|trip_distance|fare_amount|pickup_zip|dropoff_zip|
+--------------------+---------------------+-------------+-----------+----------+-----------+
| 2016-02-14 16:52:13| 2016-02-14 17:16:04| 4.94| 19.0| 10282| 10171|
| 2016-02-04 18:44:19| 2016-02-04 18:46:00| 0.28| 3.5| 10110| 10110|
| 2016-02-17 17:13:57| 2016-02-17 17:17:55| 0.7| 5.0| 10103| 10023|
| 2016-02-18 10:36:07| 2016-02-18 10:41:45| 0.8| 6.0| 10022| 10017|
| 2016-02-22 14:14:41| 2016-02-22 14:31:52| 4.51| 17.0| 10110| 10282|
+--------------------+---------------------+-------------+-----------+----------+-----------+
only showing top 5 rows
Databricks Asset Bundle Jobの削除
削除したい場合は databricks bundle destroy で削除することが可能です。お掃除しましょう。
$ databricks bundle destroy
Building sample_project...
Starting plan computation
Planning complete and persisted at /Users/akihiro.kuwano/repos/github-db/dab_sample/sample_project/.databricks/bundle/dev/terraform/plan
The following resources will be removed:
delete job sample_project_job
delete pipeline sample_project_pipeline
This will permanently destroy resources! Proceed? [y/n]: y
Starting to destroy resources
Successfully destroyed resources!
Updating deployment state...
Starting deletion of remote bundle files
Bundle remote directory is /Users/kuwano@example.com/.bundle/sample_project/dev
/Users/kuwano@example.com/.bundle/sample_project/dev and all files in it will be deleted permanently! Proceed? [y/n]: y
Deleted snapshot file at /Users/akihiro.kuwano/repos/github-db/dab_sample/sample_project/.databricks/bundle/dev/sync-snapshots/df81076f52db782f.json
Successfully deleted files!
Destroy complete!
まとめ
Databricks Asset Bundles 、いかがでしたでしょうか?
なんか長くなってしまいましたが、、、実際に一回やってみると結構仲良く慣れると思います、手運用だともう厳しいよ!CI/CDやりたい!という方、Databricks自体の構築はTerraformでやってるからGitで管理できてるけど、Jobとかその中のものはどうやって運用しよう、、、と悩んでる方、是非Databricks Asset Bundlesを試してみてくださいね!
今回は最初の1つ目だったので概要紹介でしたのでdbtとか細かい設定とか入れられなかったので反響あったら続編ありえますw
Discussion