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)
参考文档: