0

我目前正在使用 PythonThreading来并行执行多个 Databricks 笔记本。这些是长时间运行的笔记本,如果我想用新的更改重新开始执行,我需要添加一些逻辑来杀死线程。当在不终止线程的情况下重新执行主笔记本时,集群很快就会充满计算量大、寿命长的线程,几乎没有空间用于实际需要的计算。

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

我将不胜感激有关如何解决此问题的任何建议!

4

1 回答 1

1

你好@sondrelv,谢谢你的问题。我想澄清一下dbutils.notebook.exit(value),runId 不用于杀死其他线程。 dbutils.notebook.exit(value)用于使当前(this)线程退出并返回一个值。我看到了在笔记本代码中没有可用中断的管理难度。鉴于此限制,我试图寻找其他方法来取消线程。

一种方法是使用其他实用程序来终止线程/运行。

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

剩下的困难是获取运行 ID。临时运行从 CLI 运行列表操作中排除databricks runs list
正如您所指出的,它dbutils.notebook.run()是同步的,并且在完成之前不会向代码返回值。但是,在 notbook UI 中,运行 ID 和链接会在启动时打印出来。必须有一种方法来捕捉这些。我还没有找到如何。

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

于 2020-07-15T00:31:29.463 回答