4. Databricks Asset Bundles核心机制

Databricks Asset Bundles(简称 DAB)把作业、流水线、模型等 Databricks 资源从“在 UI 里手工点出来”变成“用声明式配置描述出来”。它的核心载体就是项目根目录下的 databricks.yml(也常被称作 bundle 配置文件)。理解这个文件的结构,等于掌握了整个 Bundle 的骨架:哪些字段决定项目身份,哪些字段声明资源,哪些字段负责把同一份资源映射到不同环境。

一个典型的 Bundle 目录通常长这样:根目录放 databricks.yml,资源定义放在 resources/ 下,源码放在 src/ 下。配置文件本身由若干顶层块组成,最关键的几块是:bundle(项目名)、include(引入其它配置文件)、workspace(工作区主机与认证)、variables(变量声明)、targets(目标环境)以及 resources(资源声明)。其中 resources 和 targets 是日常改动最频繁的两块。

databricks.yml 结构与目标环境参数化 databricks.yml bundle: name: aidataops_bundle include: resources/*.yml workspace: host / auth_type variables: catalog / schema targets: dev / staging / prod resources: jobs / pipelines / models sync: include / exclude artifacts: whl / jar 构建 run_as / permissions resources 资源声明 jobs etl_daily_job tasks / schedule pipelines silver_pipeline catalog / target models churn_model serving endpoint experiments mlflow_experiment artifact_path targets 目标环境参数化 dev mode: development catalog: dev_cat schema: dev_sch pause: true prefix: [dev] workspace: dev_ws staging mode: production catalog: stg_cat schema: stg_sch pause: false prefix: [stg] workspace: stg_ws prod mode: production catalog: prd_cat schema: prd_sch pause: false prefix: [prd] workspace: prd_ws 映射 声明

先看 resources。它下面按资源类型分组,常见的有 jobs、pipelines、models、experiments。每个资源有一个逻辑键(如 etl_daily_job),这个键是 Bundle 内部引用资源的名字,部署时 Databricks 会据此生成或更新真实资源。以作业为例,一个最小声明包含 name、tasks,任务里再指定 notebook_path 或 python_wheel_task、集群配置等。流水线则用 catalog、target、libraries 描述。模型资源通常配合 MLflow 实验路径与 serving 端点声明。

resources:
  jobs:
    etl_daily_job:
      name: "etl_daily_${var.env}"
      schedule:
        quartz_cron_expression: "0 0 2 * * ?"
        timezone_id: "Asia/Shanghai"
      tasks:
        - task_key: bronze_to_silver
          notebook_task:
            notebook_path: ../src/etl/bronze_to_silver.py
          new_cluster:
            spark_version: "15.4.x-scala2.12"
            node_type_id: "i3.xlarge"
            num_workers: 2
  pipelines:
    silver_pipeline:
      name: "silver_pipeline_${var.env}"
      catalog: ${var.catalog}
      target: ${var.schema}
      libraries:
        - notebook:
            path: ../src/pipeline/silver.py

注意上面出现的 ${var.env}、${var.catalog},这就是参数化的入口。变量在顶层 variables 中声明,可以给默认值,也可以不给。声明之后,在 resources 里用 ${var.xxx} 引用,在 targets 里为每个环境覆盖具体取值。这样同一份资源定义就能在 dev、staging、prod 之间复用,而差异只集中在 target 块里。

targets 是环境差异的集中地。每个 target 可以覆盖变量、指定不同的 workspace host、设置 mode(development 或 production)、配置 presets(如名称前缀、是否暂停调度)、以及 run_as 身份。development 模式下,Databricks 会自动给资源名加前缀、把调度暂停,避免开发环境误触发生产任务;production 模式则保持资源名与调度原样。这种“同一份声明、多环境投影”的机制,正是 DataOps 持续交付的基础。

变量覆盖的优先级需要记清楚:命令行 --var 最高,其次是 target 中的 variables,最后是顶层 variables 的默认值。理解这个顺序,才能在排查“为什么部署到 prod 却用了 dev 的 catalog”这类问题时快速定位。

写完配置后,不要急着部署。DAB 提供了一组本地验证命令,可以在不触碰远端工作区的情况下先做静态检查。databricks bundle validate 会解析 YAML、检查字段合法性、校验变量引用与资源引用是否完整,并输出解析后的最终配置。加上 -t prod 可以验证指定 target 的展开结果,确认参数覆盖是否符合预期。databricks bundle schema 可以输出当前 CLI 版本支持的完整配置 schema,用于对照字段名。databricks bundle summary 则展示 Bundle 的概览信息,包括资源数量与目标环境。

# 验证默认 target
databricks bundle validate

# 验证 prod 目标,查看变量展开结果
databricks bundle validate -t prod

# 查看解析后的完整配置(含变量替换)
databricks bundle validate -t prod --output json

# 查看 Bundle 概览
databricks bundle summary -t prod

验证通过后,常用命令是 databricks bundle deploy -t dev 部署到开发环境,databricks bundle run etl_daily_job -t dev 触发运行,databricks bundle destroy -t dev 清理资源。部署时 Bundle 会计算期望状态与当前状态的差异,只做必要的创建或更新,这也是它比手工操作更适合持续交付的原因。

建议把 databricks bundle validate -t prod 放进 CI 流水线的必过检查项。配置错误在本地或 CI 阶段暴露,成本远低于部署到生产后再回滚。
变量未声明就引用、target 名拼写错误、资源逻辑键重复,是 validate 阶段最常见的三类报错。遇到报错先看它指出的文件与行号,再对照 schema 确认字段层级,不要凭记忆猜测。

把这几块串起来看:resources 回答“要创建什么”,variables 回答“哪些值需要可变”,targets 回答“每个环境取什么值”,validate 回答“这份配置是否自洽”。四者配合,才构成一个可重复、可审查、可回滚的 Bundle 交付单元。