Databricks Bundle Run变量替换失效问题咨询
问题场景
使用Databricks Bundle定义带命名参数的作业,参数绑定了含默认值的bundle变量,期望通过databricks bundle run --var临时覆盖变量值触发单次运行,且不修改作业全局默认值。
作业任务定义:
tasks: - task_key: ci_start job_cluster_key: job_cluster libraries: - whl: ../../dist/*.whl python_wheel_task: package_name: ci_workflows entry_point: ci_start named_parameters: postfix: ${var.postfix}
变量声明:
variables: postfix: description: Suffix used for integration tests during CI. default: "init"
执行以下命令时,作业仍使用默认值"init":
databricks bundle deploy databricks bundle run --var="postfix=abc" my_job
而先执行databricks bundle deploy --var="postfix=abc"再run会生效,但会修改作业全局默认值,不符合需求。
原因分析
databricks bundle deploy执行时,会将配置中的${var.postfix}替换为默认值"init",并将静态作业定义同步到Databricks平台。后续执行databricks bundle run时,默认会触发已部署的静态作业,不会重新解析本地bundle配置中的变量,因此--var传入的值无法生效。
解决方案
要实现临时覆盖变量且不修改全局作业配置,需让databricks bundle run基于当前本地配置(含临时传入的变量值)创建临时作业运行,而非复用已部署的静态作业。
方案1:使用--no-use-existing参数强制生成临时运行
执行命令:
databricks bundle run --var="postfix=abc" my_job --no-use-existing
该参数会忽略已部署的作业,直接基于当前bundle配置(包含传入的变量覆盖值)创建临时作业实例并运行,不会修改平台上的作业默认配置。
方案2:调整配置使用运行时变量绑定
修改任务定义中的参数绑定方式,确保变量在运行时动态解析:
tasks: - task_key: ci_start job_cluster_key: job_cluster libraries: - whl: ../../dist/*.whl python_wheel_task: package_name: ci_workflows entry_point: ci_start named_parameters: postfix: "{{ var.postfix }}"
修改后,执行databricks bundle run --var="postfix=abc" my_job时,会直接基于本地配置解析变量值,无需依赖已部署的作业,自然不会修改全局默认值。
内容的提问来源于stack exchange,提问作者Saugat Mukherjee

