您可以在 Databricks Pool 节点上预安装库吗?

Can you pre-install libraries on Databricks Pool nodes?

我们有许多 Python Databricks 作业,它们都使用相同的底层 Wheel 包来安装它们的依赖项。安装此 Wheel 包,即使节点已在池中闲置仍需要 90 秒。

其中一些作业很长-运行所以我们想使用作业计算机集群for the lower cost in DBUs.

其中一些作业要短得多 -运行(<10 秒),其中 90 秒的安装时间似乎更重要。我们一直在考虑为这些较短的作业使用热集群(通用计算)。如果可能,我们希望避免通用计算的额外费用。

阅读 Databricks 文档表明 Idle instances in the Pool are reserved for us but not costing us DBUs。有没有办法让我们在空闲实例上预安装所需的库,以便在作业完成时我们能够立即开始处理它?

是否有替代方法可以满足类似的用例?

您不能将库直接从池中安装到节点中,因为实际代码是在 Databricks Runtime 对应的 Docker 容器中执行的。有几种方法可以加快库的安装速度:

  • 创建您的 own Docker image with all necessary libraries pre-installed, and pre-load Databricks Runtime version and your Docker image - this part couldn't be done via UI, so you need to use REST API (see description of preloaded_docker_images attribute), databrick-cli, or Databricks Terraform provider。自定义 Docker 图像的主要缺点是某些功能不是开箱即用的,例如 Repos 中的任意文件、Web 终端等(不记得完整列表)
  • 将所有必需的库及其依赖项放入 DBFS 并通过 cluster init script 安装它们。收集二进制依赖项非常重要,而不是仅包含源代码的软件包,因此安装时不需要编译它们。这可以做一次:
    • 对于 Python 这可以用 pip download --prefer-binary lib1 lib2 ...
    • 来完成
    • 对于 Java/Scala,您可以使用 mvn dependency:get -Dartifact=<maven_coordinates>,这会将依赖项下载到 ~/.m2/repository 文件夹中,您可以从中将 jar 复制到 DBFS,并在初始化脚本中使用 cp /dbfs/.../jars/* /databricks/jars/命令
    • 对于 R,它稍微复杂一些,但也是可行的