Databricks Asset Bundles (DABs)をFreeEdtionプランで試してみる
はじめに
こんにちは。普段フルスタックエンジニアとして活動しているAsorです。
データエンジニアとして、データモデリングやETLの開発はもちろん大事ですが、基盤(プラットフォーム自体やインフラレイヤー)の管理も重要なタスクだと考えています。
今回はデータプラットフォームであるDatabricksのIaCツールであるDatabricks Asset Bundlesを触ってみたいと思います。なお筆者のFreeEdtion(無料プラン)でできる範囲となりますことご了承ください。
Databricksとは
Databricks(データブリックス) は、クラウド上で データの収集・加工(ETL)/分析(SQL)/機械学習・生成AI までを一つの環境で実行・運用できる統合データプラットフォームです。基盤に Apache Sparkを採用し、データレイクとデータウェアハウスの利点を統合する 「レイクハウス」 という考え方で、大規模データの処理とチーム開発を効率化します。
Databricks Asset Bundles(DABs)とは
Databricks Asset Bundles(DABs) は、Databricks上の ノートブック・ジョブ・ワークフロー・設定 などをひとまとめにし、開発/ステージング/本番といった環境間で 一貫してデプロイ・管理 するための仕組みです。
YAMLファイルで定義するのが特徴で、CI/CDと相性が良く、再現性の高い運用を実現できます。
本記事の目的
- Databricks Asset Bundlesの利用方法を理解する
- FreeEdtionでの実行方法について理解する
前提
1. Databricksのアカウント作成する
現在無料版が提供されていますので、気軽に試すことができます。
2. Databricks CLIをインストールする
Databricks Asset Bundlesを開始するには現状DatabricksのコマンドラインツールであるDatabricks CLIが必要です。自身のPCにインストールしておきます。
# MacOSの場合
brew update && brew install databricks
インストールができているか確認します
databricks version
> Databricks CLI v0.287.0
触ってみる
準備
- デモ用のUnityCatalogの作成。
今回のデモの過程で作成されるスキーマやボリュームのためにdabs_demoという名前で作っています。既存のものでも構いません。
1. CLI経由で認証する
Databricks CLIから自身のアカウントにログインするために以下のコマンドを実行します。
設問に回答するとブラウザが起動し、認証完了ページが表示されます。
認証が完了していればブラウザは閉じてしまって構いません。
databricks auth login
> Databricks profile name [DEFAULT]: # 今回は特に指定しないので空のままEnter
> Databricks host (e.g. https://<databricks-instance>.cloud.databricks.com): # 自分のアカウントでログインした際のURL
試しに一つコマンドを実行してみます。
ブラウザからみたworkspaceの一覧と同じ情報が確認できると思います。
databricks workspace list /
> ID Type Language Path
> 111111111111111 DIRECTORY /Users
> 222222222222222 DIRECTORY /Shared
> 333333333333333 DIRECTORY /Repos
2. Databricks Asset Bundleのプロジェクトを作成する
ここからDatabricks Asset Bundlesを実際に操作していきます。
プロジェクトの初期化
databricks bundle init
> Search: █
> ? Template to use:
> default-python (The default Python template for Notebooks and Lakeflow)
> default-sql
> default-minimal # 今回はこれを指定します
> default-scala
> ↓ dbt-sql
まずはテンプレートの選択を要求されるので、ここではdefault-minimalを指定します。
選択してEnterを押すと、質問が続きます。
- プロジェクト名: ご自身で好きな名前を指定してください。(例
dbas_demo_pj) - Catalog: dabs_demo
- 個人用のカタログを作成するか: 今回はNo
- 言語: Python
Welcome to the minimal Databricks Asset Bundle template!
This template creates a minimal project structure without sample code, ideal for advanced users.
(For getting started with Python or SQL code, use the default-python or default-sql templates instead.)
Your workspace at https://hogehoge.cloud.databricks.com is used for initialization.
(See https://docs.databricks.com/dev-tools/cli/profiles.html for how to change your profile.)
Unique name for this project [my_project]: dbas_demo_pj
Default catalog for any tables created by this project [workspace]: dabs_demo
Use a personal schema for each user working on this project.
(This is recommended. Your personal schema will be 'dabs_demo.asor'.): no, I will customize the schema configuration later in databricks.yml
Initial language for this project: python
✨ Your new project has been created in the 'dbas_demo_pj' directory!
To get started, refer to the project README.md file and the documentation at https://docs.databricks.com/dev-tools/bundles/index.html.
全ての設問に回答すると、プロジェクト名と同じフォルダが作成されます。
3. 作成されたファイルを確認する
作成されたファイルたちをみていきましょう。
cd dbas_demo_pj # 自身で指定したプロジェクト名
cursor . # お好きなエディタで開いてください
と言っても今回見ていくのは1つだけで、databricks.ymlとなります。
-
bundle: Bundleの基本情報 -
include: ここで指定したパスのファイルも読み込まれます -
variables: プロジェクト内で利用したい変数を定義できます -
targets: Prod, stg, devなどデプロイ先をそれぞれ定義することができます

4. リソースを定義する
それでは実際にDatabricksのリソースを定義していきましょう。今回作成するものは以下の通りです。
クイックスタートで紹介されているシンプルなJobです。

こちらは、2つのTaskから成るJobで、それぞれのタスクではノートブックファイルが実行されます
今回用意するファイルは以下の3つです。ソースコードは長いので折りたたんでいます。
resources/babynames.ymlsrc/notebooks/retrieve_and_save_data.ipynbsrc/notebooks/read_and_display_filtered_data.ipynb
babynames.yml
resources:
schemas:
demo_schema:
name: "dbas_demo_schema"
catalog_name: "dabs_demo"
volumes:
demo_volume:
name: "dbas_demo_volume"
catalog_name: "dabs_demo"
schema_name: ${resources.schemas.demo_schema.name}
volume_type: "MANAGED"
jobs:
demo_job:
name: dbas_demo_job
tasks:
- task_key: retrieve-baby-names-task
notebook_task:
notebook_path: ../src/notebooks/retrieve_and_save_data.ipynb
source: WORKSPACE
base_parameters:
VOLUME_PATH: "/Volumes/dabs_demo/${resources.schemas.demo_schema.name}/${resources.volumes.demo_volume.name}"
- task_key: read-and-display-data-task
depends_on:
- task_key: retrieve-baby-names-task
notebook_task:
notebook_path: ../src/notebooks/read_and_display_filtered_data.ipynb
source: WORKSPACE
base_parameters:
VOLUME_PATH: "/Volumes/dabs_demo/${resources.schemas.demo_schema.name}/${resources.volumes.demo_volume.name}"
retrieve_and_save_data.ipynb
import requests
dbutils.widgets.text("VOLUME_PATH", "")
volume_path = dbutils.widgets.get("VOLUME_PATH")
response = requests.get('https://health.data.ny.gov/api/views/jxy9-yhdk/rows.csv')
csvfile = response.content.decode('utf-8')
dbutils.fs.put(f"{volume_path}/babynames.csv", csvfile, True)
read_and_display_filtered_data.ipynb
dbutils.widgets.text("VOLUME_PATH", "")
volume_path = dbutils.widgets.get("VOLUME_PATH")
babynames = spark.read.format("csv").option("header", "true").option("inferSchema", "true").load(f"{volume_path}/babynames.csv")
babynames.createOrReplaceTempView("babynames_table")
years = spark.sql("select distinct(Year) from babynames_table").toPandas()['Year'].tolist()
years.sort()
dbutils.widgets.dropdown("year", "2014", [str(x) for x in years])
display(babynames.filter(babynames.Year == dbutils.widgets.get("year")))
5. デプロイする
それでは定義したリソースをDatabricks上にデプロイしてみましょう。
-t devをつけることで、databrick.ymlのtargetsに定義されたデプロイ先を指定します。
databricks bundle deploy -t dev --profile DEFAULT
> Uploading bundle files to /Workspace/Users/hogehoge/.bundle/dbas_demo_pj/dev/files...
> Deploying resources...
> Updating deployment state...
> Deployment complete!
6. デプロイされたリソースを確認する
私は以前作成したJobやPipelineがあるのを隠しているためわかりずらいですが、Jobが無事作成されていることを確認できます。

実際にJobを実行して成功することも確認できます。

まとめ
Databricks Asset Bundlesを利用してIaCを行うことができました。
今回はお試しのため、ローカルからコマンドを手動で実行していましたが、実務ではGitHubActionsなどCI/CD上でコマンドを実行する運用になると思います。
FreeEdtionもあって気軽に試せると思うので、気になる方はぜひご自身でも試してみてください。
Discussion