繁体   English   中英

如何在 Databricks notebook 中获取运行参数和 runId?

[英]How do you get the run parameters and runId within Databricks notebook?

将 Databricks 笔记本作为作业运行时,您可以指定可在笔记本代码中使用的作业或运行参数。 但是,文档中并不清楚您实际上是如何获取它们的。 我希望能够获取所有参数以及作业 ID 和运行 ID。

作业/运行参数

当笔记本作为作业运行时,可以使用 Databricks 自动提供和导入的dbutils package 将任何作业参数作为字典获取。 这是代码:

run_parameters = dbutils.notebook.entry_point.getCurrentBindings()

如果作业参数是{"foo": "bar"} ,那么上面代码的结果会为您提供 dict {'foo': 'bar'} 请注意,Databricks 仅允许strstr的作业参数映射,因此键和值将始终是字符串。

请注意,如果笔记本以交互方式运行(而不是作为作业),则 dict 将为空。 getCurrentBinding()方法似乎也适用于获取笔记本的任何活动小部件值(以交互方式运行时)。

获取jobId和runId

要获取jobIdrunId ,您可以从包含该信息的dbutils获取上下文 json。 (改编自databricks论坛):

import json
context_str = dbutils.notebook.entry_point.getDbutils().notebook().getContext().toJson()
context = json.loads(context_str)
run_id_obj = context.get('currentRunId', {})
run_id = run_id_obj.get('id', None) if run_id_obj else None
job_id = context.get('tags', {}).get('jobId', None)

所以在上下文 object 中, runId的键路径是currentRunId > id ,而jobId的键路径是tags > jobId

如今,您可以通过小部件 API 轻松地从作业中获取参数。这在 Databricks 的官方文档中有很好的描述。 下面,我将详细说明您到达那里必须采取的步骤,这很容易。

  1. 创建或使用必须接受某些参数的现有笔记本。 我们想知道job_idrun_id ,我们还要添加两个用户定义的参数environmentanimal

     # Get parameters from job job_id = dbutils.widgets.get("job_id") run_id = dbutils.widgets.get("run_id") environment = dbutils.widgets.get("environment") animal = dbutils.widgets.get("animal") print(job_id) print(run_id) print(environment) print(animal)
  2. 现在让我们 go 到 Workflows > Jobs 来创建一个参数化的工作。 确保您 select 是正确的笔记本并在底部指定作业的参数。 根据文档,我们需要为job_idrun_id的参数值使用大括号。 对于其他参数,我们可以自己选择一个值。

注意:不允许直接从笔记本获取job_idrun_id的原因是出于安全原因(正如您在尝试访问上下文属性时从堆栈跟踪中看到的那样)。 在笔记本中,您处于不同的上下文中,这些参数处于“更高”的上下文中。

  1. 运行作业并观察它输出如下内容:

     dev squirrel 137355915119346 7492 Command took 0.09 seconds
  2. 您甚至可以在笔记本本身中设置默认参数,如果您运行笔记本或者笔记本是从没有参数的作业中触发的,就会使用这些参数。 这使测试更容易,并允许您默认某些值。

     # Adding widgets to a notebook dbutils.widgets.text("environment", "tst") dbutils.widgets.text("animal", "turtle") # Removing widgets from a notebook dbutils.widgets.remove("environment") dbutils.widgets.remove("animal") # Or removing all widgets from a notebook dbutils.widgets.removeAll()
  1. 最后但同样重要的是,我在不同的集群类型上对此进行了测试,到目前为止我没有发现任何限制。 我当前的设置是:

     spark.databricks.cluster.profile serverless spark.databricks.passthrough.enabled true spark.databricks.pyspark.enableProcessIsolation true spark.databricks.repl.allowedLanguages python,sql

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM