我们有许多Python Databricks作业,它们都使用相同的底层Wheel包来安装它们的依赖项。即使节点在池中处于空闲状态,安装此Wheel程序包仍需要90秒。
其中一些作业的运行时间很长,因此我们希望使用jobs计算机集群来降低DBU的成本。
其中一些作业的运行时间要短得多(<10秒(,其中90秒的安装时间似乎更重要。我们一直在考虑将热集群(All Purpose Compute(用于这些较短的作业。如果可能的话,我们希望避免所有用途计算机的额外成本。
阅读Databricks文档表明,池中的Idle实例是为我们保留的,但不会占用我们的DBU。我们有没有办法在空闲实例上预装所需的库,这样当作业完成时,我们就可以立即开始处理它?
是否有一种替代方法可以实现类似的用例?
您不能直接从池中将库安装到节点中,因为实际代码是在Databricks Runtime对应的Docker容器中执行的。有几种方法可以加快库的安装:
- 创建自己的Docker镜像,预先安装所有必要的库,并预先加载Databricks Runtime版本和Docker镜像-这部分无法通过UI完成,因此您需要使用REST API(请参阅
preloaded_docker_images
属性的描述(、Databricks-cli或Databricks-Terraform提供程序。自定义Docker镜像的主要缺点是一些功能无法开箱即用,例如Repos、web终端等中的任意文件(不记得完整列表( - 将所有必要的库及其依赖项放到DBFS上,并通过集群init脚本进行安装。收集二进制依赖项非常重要,而不是只收集源代码的包,所以在安装时不需要编译它们。这可以做一次:
- 对于Python,这可以用
pip download --prefer-binary lib1 lib2 ...
来完成 - 对于Java/Scala,您可以使用
mvn dependency:get -Dartifact=<maven_coordinates>
,它将把依赖项下载到~/.m2/repository
文件夹中,从中可以将jar复制到DBFS,并在init脚本中使用cp /dbfs/.../jars/* /databricks/jars/
命令 - 对于R,它稍微复杂一些,但也是可行的
- 对于Python,这可以用
除了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"
}
}
}