メインコンテンツまでスキップ

バンドルとバンドルファイルの共有

多くの場合、組織は多くのバンドルを保持しており、これらのより高度な CI/CD シナリオでは、これらのバンドルは共通の構成とファイルを共有します。たとえば、バンドルは共有の場所に保存されているライブラリを共有したり、コンピュートの設定と変数を共有の場所の構成ファイルで定義したりできます。

この記事では、共有フォルダ内の設定とファイルを使用するように 2 つのバンドルを設定する方法について説明します。 完全な共有バンドルの例は、 bundle-examples GitHub リポジトリにあります。

その他の CI/CD のベスト プラクティスについては、「 Databricks のベスト プラクティスと推奨される CI/CD ワークフロー」を参照してください。

リポジトリの構造

多くのバンドルを持つ組織では、バンドルを 1 つのリポジトリに配置して、共有フォルダを使用するのが一般的です。複数のバンドルを含むリポジトリ構造の例を次に示します。

databricks-bundle-repo/
├── shared
│ ├── variables.yml # has variable definitions like cluster_id
│ └── shared_library.py # has shared code used in multiple bundles
├── job_bundle
│ ├── databricks.yml # uses ${var.cluster_id} defined in variables.yml
│ ├── resources/
│ │ └── job_bundle.job.yml
│ ├── src/
│ │ ├── notebook.ipynb
│ │ └── my_python.py # uses ../shared/shared_library.py
│ └── README.md
├── pipeline_bundle
│ ├── databricks.yml
│ ├── resources/
│ │ ├── pipeline_bundle.job.yml # uses ${var.cluster_id} defined in variables.yml
│ │ └── pipeline_bundle.pipeline.yml
│ ├── src/
│ │ └── dlt_pipeline.ipynb
│ └── README.md

ファイル共有の構成

バンドルの外部にコードファイルを含めるには、同期マッピングpaths キーで指定します。

たとえば、リポジトリ内の shared フォルダ (バンドル フォルダと同じレベル) に次のものが含まれているとします。

  • 次の内容を含む shared_library.py コード ファイル:

    Python
    def multiply(a: int, b: int) -> int:
    return a * b
  • 内容の variables.yml :

    YAML
    variables:
    cluster_id:
    default: 1234-567890-abcde123

この場合、共有コード・ファイルと、共有構成で定義されたバンドル変数を使用するバンドル構成は、次のようになります。

YAML
# databricks.yml

bundle:
name: job_bundle

sync:
paths:
- ../shared
- ./src

include:
- resources/*.yml
- ../shared/*.yml

targets:
dev:
mode: development
default: true
workspace:
host: https://my-workspace.cloud.databricks.com

prod:
mode: production
workspace:
host: https://my-workspace.cloud.databricks.com
root_path: /Workspace/Users/someone@example.com/.bundle/${bundle.name}/${bundle.target}
permissions:
- user_name: someone@example.com
level: CAN_MANAGE
YAML
# job_bundle.yml

resources:
jobs:
my_python_job:
name: my_python_job
tasks:
- task_key: python_task
spark_python_task:
python_file: src/my_python.py # uses ../shared/shared_library.py
my_notebook_job:
name: my_notebook_job
tasks:
- task_key: notebook_task
existing_cluster_id: ${var.cluster_id} # defined in ../shared/variables.yml
notebook_task:
notebook_path: src/notebook.ipynb
Python
# my_python.py

import os
import sys

# Traverse to the sync root path.
# Note: this requires DBR >= 14 or serverless.
shared_path = os.getcwd() + "/../../shared"

# Add the shared directory to the Python path.
sys.path.append(shared_path)

# Import a function from shared_library.py
from shared_library import multiply

# Use the function.
result = multiply(2, 3)
print(result)

バンドルの検証

バンドル構成を常に検証することが重要であり、特にバンドルがファイルと構成を共有する場合は特に検証します。databricks bundle validate コマンドは、バンドルで指定された変数、ファイル、およびパスが存在し、適切に継承および構成されていることを確認し、問題に関する情報を出力して、デプロイ前に問題を修正できるようにします。バンドルの検証を参照してください。

デプロイする前に、各バンドルに対して次のコマンドを実行します。

Bash
databricks bundle validate

共有バンドルの権限

組織内では、バンドルは多くの場合、さまざまな責任とアクセス許可レベルを持つさまざまな個人によって開発、デプロイ、および実行されます。すべてのユーザーがバンドルを表示できる必要がある場合もあれば、一部のユーザーがバンドルの変更をデプロイしてターゲット開発ワークスペースでリソースを実行できるようにする必要がある場合もあれば、一部のユーザーがバンドルの変更と実行リソースを本番運用にデプロイできる必要がある場合や、サービスプリンシパルを使用する自動ワークフローがバンドル内のリソースを実行できる必要がある場合もあります。 組織内のすべてのユーザーが共有バンドルを効果的に管理できるようにするには、最上位の権限と本番運用ターゲットの権限を設定します。 バンドル内のすべてのリソースにアクセス許可を適用する最上位のアクセス許可については、「 アクセス許可」を参照してください。

ヒント

ワークスペースの Databricks アセット バンドルを使用すると、バンドルでのコラボレーションが容易になります。「ワークスペースでのバンドルでの共同作業」を参照してください。

たとえば、共有バンドルの databricks.yml は次のようになります。

YAML
# databricks.yml

bundle:
name: shared_bundle

include:
- resources/*.yml

permissions:
- level: CAN_VIEW
group_name: all_users
- level: CAN_MANAGE
group_name: data_engineering_users
- level: CAN_RUN
service_principal_name: 123456-abcdef

targets:
dev:
mode: development
default: true
workspace:
host: https://my-workspace.cloud.databricks.com

prod:
mode: production
workspace:
host: https://my-workspace.cloud.databricks.com
root_path: /Workspace/Users/someone@example.com/.bundle/${bundle.name}/${bundle.target}
permissions:
- user_name: someone@example.com
level: CAN_MANAGE