我们有许多 Python Databricks 作业,它们都使用相同的底层 Wheel 包来安装其依赖项。即使节点已在池中闲置,安装此 Wheel 软件包仍需要 90 秒。
其中一些作业运行时间非常长,因此我们希望使用作业计算机集群以降低 DBU 的成本。
其中一些工作的运行时间要短得多(<10 seconds) where the 90 second install time seems more significant. We have been considering using a hot cluster (All-Purpose Compute) for these shorter jobs. We would like to avoid the extra cost of the All-Purpose Compute if possible.
阅读 Databricks 文档表明,池中的空闲实例是为我们保留的,但不会消耗我们的 DBU 。有没有办法让我们在空闲实例上预安装所需的库,以便当作业完成时我们能够立即开始处理它?
是否有替代方法可以满足类似的用例?
您无法将库直接安装到池中的节点中,因为实际代码是在Databricks Runtime对应的Docker容器中执行的。有多种方法可以加快库的安装速度:
preloaded_docker_images
属性的描述)、databrick-cli 或 Databricks Terraform 提供程序。自定义 Docker 镜像的主要缺点是某些功能无法开箱即用,例如 Repos 中的任意文件、Web 终端等(不记得完整列表)pip download --prefer-binary lib1 lib2 ...
mvn dependency:get -Dartifact=<maven_coordinates>
,它将下载依赖项到 ~/.m2/repository
文件夹,您可以从该文件夹将 jar 复制到 DBFS 并在 init 脚本中使用 cp /dbfs/.../jars/* /databricks/jars/
命令除了 Alex Ott 的解决方案之外,如果您使用基于 Terraform 的解决方案,您还可以添加一个requirements.txt 文件,您需要在其中添加所有必需的 python 库。如果集群中需要安装任何 Maven/Java 库,您可以将它们添加为 Terraform 代码中的列表变量。然后使用如下代码
dynamic "library" {
for_each = toset(split("\n", file("./requirements.txt")))
content {
pypi {
package = library.value
repo = "if_there_is_any_repo"
}
}
}