如何终止Databricks笔记本的并行执行?

时间:2020-07-07 09:21:47

标签: multithreading parallel-processing databricks dbutils

我目前正在使用Python的Threading来并行执行多个Databricks笔记本。这些是运行时间较长的笔记本,在我想通过新更改重新开始执行的情况下,需要添加一些逻辑来杀死线程。在不中断线程的情况下重新执行主笔记本时,群集中很快就充满了计算量大,寿命长的线程,为实际所需的计算留出了很少的空间。

我尝试了these条建议,但没有运气。此外,我尝试从dbutils.notebook.run()获取runId并使用dbutils.notebook.exit(runId)杀死线程,但是由于对dbutils.notebook.run()的调用是同步的,因此我无法在笔记本执行之前获取runId

对于如何解决此问题的任何建议,我将不胜感激!

1 个答案:

答案 0 :(得分:1)

您好@sondrelv,谢谢您的提问。我想澄清一下,dbutils.notebook.exit(value)并不用于通过runId杀死其他线程。 dbutils.notebook.exit(value)用于使当前(此)线程退出并返回值。 我看到了在笔记本代码中管理without an available interrupt的困难。鉴于此限制,我试图寻找其他方法来取消线程。

一种方法是使用其他实用程序杀死线程/运行。

解决此问题的部分困难在于,通过dbutils.notebook.run()创建的线程/运行是短暂运行。 Databricks CLI databricks runs get --run-id <ephemeral_run_id>可以获取临时运行的详细信息。如果可以获取详细信息,则取消也应该有效(databricks runs cancel ...)。

剩下的困难是获取运行ID。 CLI运行列表操作databricks runs list中不包括临时运行。
如您所述,dbutils.notebook.run()是同步的,并且直到完成才返回值。 但是,在notbook UI中,运行ID和链接在启动时会被打印。必须有一种方法来捕获这些。我还没有找到方法。

另一种可能的解决方案是为子笔记本创建一些端点或资源,以检查它们应该继续执行还是使用dbutils.notebooks.exit()提前退出。在每隔几个单元格之间进行一次检查将类似于您链接的文章中的方法,只是应用于笔记本而不是线程。