👏

Databricks で CI/CD !Databricks Asset Bundles しよ!

2024/05/04に公開

最近ファミレス行こ!を読んだので影響をうけています

https://amzn.to/3QtxEhL

Databricks Asset Bundles がGAしました!

最近DatabricksをCLIでデプロイ、実行などのコントロールができるDatabricks Asset BundlesがGAしました!

https://www.databricks.com/jp/blog/announcing-general-availability-databricks-asset-bundles

そんななか、、、ぼくは思ったわけです、、、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のJob画面

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

Jobの実行成功画面

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