如何用Databricks Asset Bundles在多环境为DLT及Notebook任务设置默认目录
针对Notebook任务逐个配置参数效率低的问题,推荐以下几种高效方式:
1. DAB全局环境变量直接注入
在databricks.yaml的环境定义中统一配置目录/模式参数,然后在Notebook任务中直接引用,无需重复编写base_parameters:
environments: dev: vars: default_catalog: dev_catalog default_schema: dev_schema prod: vars: default_catalog: prod_catalog default_schema: prod_schema resources: jobs: raw_to_silver_job: name: "raw_to_silver" tasks: - task_key: "process_notebook" notebook_task: notebook_path: "/Workspace/Notebooks/raw_to_silver" base_parameters: catalog: "{{ env.default_catalog }}" schema: "{{ env.default_schema }}"
利用DAB的变量替换能力,所有Notebook任务都能复用环境级的参数定义,避免重复配置。
2. 封装Notebook全局配置模块
创建一个通用的config_notebook,专门负责读取环境参数并设置全局会话配置,其他业务Notebook直接导入该模块即可:
# config_notebook.py import os from pyspark.sql import SparkSession # 读取DAB注入的参数或环境变量 default_catalog = dbutils.widgets.get("catalog") if dbutils.widgets.get("catalog") else os.environ.get("DEFAULT_CATALOG") default_schema = dbutils.widgets.get("schema") if dbutils.widgets.get("schema") else os.environ.get("DEFAULT_SCHEMA") # 设置Spark会话默认目录/模式 spark = SparkSession.getActiveSession() spark.sql(f"USE CATALOG {default_catalog}") spark.sql(f"USE SCHEMA {default_schema}") # 定义全局变量供其他Notebook使用 globals()["DEFAULT_CATALOG"] = default_catalog globals()["DEFAULT_SCHEMA"] = default_schema
业务Notebook只需添加一行导入:
%run "/Workspace/Notebooks/config_notebook" # 直接使用全局变量 df = spark.read.table(f"{DEFAULT_SCHEMA}.raw_data")
不用每个Notebook都处理参数传递,统一由配置模块管理。
3. DAB任务模板复用
将Notebook任务的通用配置封装为DAB模板,后续任务直接引用模板,自动继承参数配置:
templates: notebook_task_template: task_key: "{{ task_key }}" notebook_task: notebook_path: "{{ notebook_path }}" base_parameters: catalog: "{{ env.default_catalog }}" schema: "{{ env.default_schema }}" resources: jobs: raw_to_silver_job: name: "raw_to_silver" tasks: - template: notebook_task_template vars: task_key: "process_raw" notebook_path: "/Workspace/Notebooks/raw_to_silver" silver_to_gold_job: name: "silver_to_gold" tasks: - template: notebook_task_template vars: task_key: "process_silver" notebook_path: "/Workspace/Notebooks/silver_to_gold"
通过模板复用,批量创建Notebook任务时无需重复编写参数部分。
1. 独立配置文件管理
创建单独的env_config.yaml文件,集中存储各环境的目录/模式配置,然后在databricks.yaml中导入:
# env_config.yaml dev: default_catalog: dev_catalog default_schema: dev_schema prod: default_catalog: prod_catalog default_schema: prod_schema
在databricks.yaml中引用:
environments: dev: vars: "{{ include 'env_config.yaml' | fromYaml | get('dev') }}" prod: vars: "{{ include 'env_config.yaml' | fromYaml | get('prod') }}"
将配置与部署逻辑分离,便于统一维护和版本控制。
2. Azure Pipelines变量组注入
将各环境的配置存入Azure Pipelines变量组(如Dev_Config、Prod_Config),然后在流水线中通过--var参数传递给DAB:
# Azure Pipelines yaml stages: - stage: DeployDev variables: - group: Dev_Config jobs: - job: DeployDAB steps: - script: | databricks bundle deploy --environment dev --var default_catalog=$(DEFAULT_CATALOG) --var default_schema=$(DEFAULT_SCHEMA) displayName: "Deploy to Dev Environment" - stage: DeployProd variables: - group: Prod_Config jobs: - job: DeployDAB steps: - script: | databricks bundle deploy --environment prod --var default_catalog=$(DEFAULT_CATALOG) --var default_schema=$(DEFAULT_SCHEMA) displayName: "Deploy to Prod Environment"
无需修改DAB配置文件,直接通过流水线变量组管理环境差异,符合CI/CD最佳实践。
3. Databricks全局初始化脚本
在Databricks工作区创建全局初始化脚本,自动为所有集群设置默认目录/模式:
# init_script.sh #!/bin/bash echo "Setting default catalog and schema..." cat << 'EOF' > /databricks/init/set_defaults.py from pyspark.sql import SparkSession import os spark = SparkSession.getActiveSession() spark.sql(f"USE CATALOG {os.environ['DEFAULT_CATALOG']}") spark.sql(f"USE SCHEMA {os.environ['DEFAULT_SCHEMA']}") EOF /databricks/python/bin/python /databricks/init/set_defaults.py
然后在DAB的集群配置中注入环境变量:
resources: clusters: processing_cluster: name: "processing-cluster" spark_env_vars: DEFAULT_CATALOG: "{{ env.default_catalog }}" DEFAULT_SCHEMA: "{{ env.default_schema }}" init_scripts: - workspace: path: "/Workspace/InitScripts/set_defaults.sh"
所有运行在该集群上的Notebook、任务都会自动加载默认目录/模式,无需在代码或任务配置中额外处理。
内容的提问来源于stack exchange,提问作者mizzlosis

