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

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

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

その他の CI/CD と開発者のベスト プラクティスについては、 Databricks の CI/CD ワークフローDatabricks の開発者のベスト プラクティスを参照してください。

リポジトリ構造

一般的な方法と Databricks の推奨事項は、共有フォルダーを持つ 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/
│   │   └── my_pipeline.ipynb
│   └── README.md

ファイル共有の構成

バンドルの外部にコード ファイルを含めるには、paths キーでそれらを指定します。

たとえば、次を含むリポジトリ (バンドル フォルダーと同じレベル) 内の shared フォルダーがあるとします。

  • コンテンツを含む shared_library.py コード ファイル:

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

    variables:
      cluster_id:
        default: 1234-567890-abcde123
    

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

# 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
# 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
# my_python.py

import os
import sys

# Traverse to the sync root path.
# Note: this requires :re[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 コマンドを使用すると、バンドルで指定された変数、ファイル、パスが確実に存在し、適切に継承および構成され、問題に関する情報を出力して、デプロイ前に修正できるようにします。 databricks バンドルの検証を参照してください。

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

databricks bundle validate

共有バンドルのアクセス許可

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

ヒント

ワークスペース内の宣言型オートメーション バンドルを使用すると、バンドルで簡単にコラボレーションできます。 ワークスペースのバンドルでの共同作業を参照してください。

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

# 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