Databricks 笔记本的已知限制
本文介绍 Databricks 笔记本的已知限制。 有关其他资源限制,请参阅资源限制。
笔记本大小调整
- 单个笔记本单元的输入限制为 6 MB。
- 修订快照自动保存、导入、导出和克隆的最大笔记本大小为 10 MB。
- 可以手动保存最多 32 MB 的笔记本。
笔记本结果表
- 表结果限制为 10K 行或 2MB,以较低者为准。
- 作业群集的最大笔记本输出大小为 30 MB。
- 非表格命令结果限制为 20MB。
- 默认情况下,文本结果最多返回 50,000 个字符。 使用 Databricks Runtime 12.2 LTS 及更高版本时,可以通过设置 Spark 配置属性
spark.databricks.driver.maxReplOutputLength
来增加此上限。
笔记本调试程序
笔记本调试程序的限制:
- 调试器仅适用于 Python。 它不支持 Scala 或 R。
- 调试器不适用于已共享访问模式群集。
- 调试器不支持单步执行外部文件或模块。
- 当调试会话处于活动状态时,无法在笔记本中运行其他命令。
SQL 仓库笔记本
SQL 仓库笔记本的限制:
- 附加到 SQL 仓库时,执行上下文的空闲超时为 8 小时。
ipywidgets
ipywidgets 的限制:
- 使用 ipywidgets 的笔记本必须附加到正在运行的群集。
- 小组件状态不会在笔记本会话中保留。 每次将笔记本附加到群集时,必须重新运行小组件单元格才能呈现它们。
- 不支持密码和控制器 ipywidget。
- 具有 LaTeX 表达式的 HTMLMath 和 Label 小组件无法正确呈现。 (例如
widgets.Label(value=r'$$\frac{x+1}{x-1}$$')
无法正确呈现。) - 如果笔记本处于深色模式,小组件可能无法正确呈现,尤其是彩色小组件。
- 小组件输出不能用于笔记本仪表板视图。
- ipywidget 的最大消息有效负载大小为 5 MB。 使用映像或大型文本数据的小组件可能无法正确呈现。
Databricks 小组件
Databricks 小组件的限制:
一个笔记本中最多可以创建 512 个小组件。
小组件名称限制为 1024 个字符。
小组件标签限制为 2048 个字符。
最多 2048 个字符可以输入到文本小组件。
对于多选、组合框或下拉小组件,最多可以有 1024 个选项。
存在一个已知问题,即在按“全部运行”后,即使在代码中清除或删除小组件,小组件状态也可能无法正确清除。 如果发生这种情况,你将看到小组件的视觉与输出状态之间的差异。 单独重新运行单元格可能会绕过此问题。 若要完全避免此问题,Databricks 建议使用 ipywidgets。
不应直接在线程、子进程或结构化流式处理 (foreachBatch) 等异步上下文中访问小组件状态,因为小组件状态在异步代码运行时可能会更改。 如果需要在异步上下文中访问小组件状态,请将其作为参数传入。 例如,如果你有以下使用线程的代码:
import threading def thread_func(): # Unsafe access in a thread value = dbutils.widgets.get('my_widget') print(value) thread = threading.Thread(target=thread_func) thread.start() thread.join()
Databricks 建议改用参数:
# Access widget values outside the asynchronous context and pass them to the function value = dbutils.widgets.get('my_widget') def thread_func(val): # Use the passed value safely inside the thread print(val) thread = threading.Thread(target=thread_func, args=(value,)) thread.start() thread.join()
小组件通常无法在笔记本中的不同语言之间传递参数。 可在 Python 单元格中创建小组件
arg1
并在 SQL 或 Scala 单元格中使用它(如果逐个运行单元格)。 但是,如果使用“全部运行”或将笔记本作为作业运行,则无法做到这一点。 部分解决方法包括:- 对于未混合使用语言的笔记本,可为每种语言创建一个笔记本,并在运行笔记本时传递参数。
- 可以使用
spark.sql()
调用来访问小组件。 例如,在 Python 中:spark.sql("select getArgument('arg1')").take(1)[0][0]
。