共享捆绑包和捆绑文件

组织通常维护许多捆绑包,在这些更高级的 CI/CD 方案中,这些捆绑包共享常见的配置和文件。 例如,捆绑包可以共享存储在共享位置中的库,也可以在共享位置的配置文件中定义计算设置和变量。

本文介绍如何配置两个捆绑包以使用共享文件夹中的配置文件和文件。 完整的共享捆绑示例位于 捆绑包示例 GitHub 存储库中。

有关其他 CI/CD 最佳做法,请参阅 Databricks 上的最佳做法和建议的 CI/CD 工作流

存储库结构

对于具有多个捆绑包的组织来说,一种常见做法是使用共享文件夹在一个存储库中查找它们。 具有多个捆绑包的示例存储库结构可能是:

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包含内容的代码文件:

    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 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 资产捆绑包,捆绑包协作将变得轻松。

例如,共享捆绑包的 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