Databricks 第12篇:Notebook 工作流

Databricks 集成了命令行,比如 %run,允许用户在一个Notebook中去执行指定的notebook,当运行 %run时,被调用的notebook会立即执行。

%run <notebook_path_name>

%run命令相当于Python语言中的import语句,在被调用notebook中定义的所有变量在当前的notebook中都可用。

注意:%run命令必须独占一行。不能使用%run去执行Python文件,并把Python文件中定义的实体导入到当前notebook中。

举个例子,有一个Python文件,NotebookA.py,包含以下代码:

x = 5

在NotebookB.py文件中,通过%run来执行NotebookA,就把变量x导入到当前的notebook中了。虽然NotebookB中并没有定义x,但是可以在NotebookB中访问x变量:

%run /path/notebookA

print(x) # => 5

 

Notebook 工作流(Notebook Workflow)是 %run 的补充,因为Notebook Workflow能够把参数传递给被调用的Notebook,并从该Notebook中返回值。通过Notebook Workflow可以构建具有依赖项的复杂工作流和管道。 例如,可以获取目录中的文件列表并将名称传递给另一个Notebook ,而 %run 则无法做到这一点。 还可以根据Notebook 的返回值创建 if-then-else 工作流或使用相对路径调用其他Notebook 。

 Notebook Workflow主要有两个函数:

dbutils.notebook.run(path: String, timeout_seconds: int, arguments: Map): String
dbutils.notebook.exit("returnValue")

1.执行Notebook

dbutils.notebook.run() 方法的参数和返回值都是字符类型,该函数被执行后,会新建一个job,立即执行path参数指定的Notebook。

  • path参数指定notebook的路径,
  • timeout参数控制执行的超时,0表示没有时间限制。
  • arguments 参数用于设置widget的值,该widget的值将会覆盖默认值。

举个例子,Notebook_C 有如下的widget:

dbutils.widgets.text("datekey","20200701")
startdatekey= int(dbutils.widgets.get("datekey"))

 当通过 dbutils.notebook.run() 调用Notebook_C时,可以向该widget来传参:

dbutils.notebook.run("Notebook_C", 0, {"datekey": "20210701"})

2,传递返回值

在被调用的Notebook中,使用exit()函数向调用者返回信息,返回的是字符串类型:

dbutils.notebook.exit("return_my_data")

在调用者中,run()函数会得到返回的字符串: "return_my_data"。

3,Notebook 工作流控制

可以通过Python代码实现Notebook调用的工作流程的控制

# Errors in workflows thrown a WorkflowException.

def run_with_retry(notebook, timeout, args = {}, max_retries = 3):
  num_retries = 0
  while True:
    try:
      return dbutils.notebook.run(notebook, timeout, args)
    except Exception as e:
      if num_retries > max_retries:
        raise e
      else:
        print("Retrying error", e)
        num_retries += 1

run_with_retry("LOCATION_OF_CALLEE_NOTEBOOK", 60, max_retries = 5)

 

 

 

 

参考文档:

Notebook workflows

posted @ 2021-11-17 16:19  悦光阴  阅读(683)  评论(0编辑  收藏  举报