添加一些依赖项后,sbt程序集任务运行缓慢

dar*_*kjh 7 deployment scala sbt sbt-assembly apache-spark

我对scala中的部署有点新意,我配置了sbt-assembly插件,一切运行良好.

几天前我添加了hadoop,spark和其他一些依赖项,然后assembly任务变得非常缓慢(8到10分钟),在此之前,它已经<30s.大部分时间用于生成程序集jar(jar需要几秒钟才能生成1MB大小).

我观察到存在很多合并冲突,这些冲突由first策略解决.这会影响装配速度吗?

我已经使用sbt的-Xmx选项(添加-Xmx4096m),但它没有帮助.

我正在使用sbt12.4和sbt-assembly.有关优化此任务的建议或指示吗?

Eug*_*ota 7

所以0__的评论是正确的:

你读过自述文件吗?它特别建议您可以更改cacheUnzipcacheOutput设置.我试试看.

cacheUnzip是一个优化功能,但cacheOutput不是.这样做的目的cacheOutput是当你的源没有改变时你获得相同的jar.对于某些人来说,重要的是输出罐不会不必要地改变.需要注意的是,它正在检查所有*.class文件的SHA-1哈希值.所以自述文件说:

如果有大量的类文件,这可能需要很长时间

据我所知,合并策略的解压缩和应用需要大约一两分钟,但SHA-1的检查似乎需要永远.这是assembly.sbt关闭输出缓存:

import AssemblyKeys._ // put this at the top of the file

assemblySettings

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>  {
    case PathList("javax", "servlet", xs @ _*)         => MergeStrategy.first
    case PathList("org", "apache", "commons", xs @ _*) => MergeStrategy.first // commons-beanutils-core-1.8.0.jar vs commons-beanutils-1.7.0.jar
    case PathList("com", "esotericsoftware", "minlog", xs @ _*) => MergeStrategy.first // kryo-2.21.jar vs minlog-1.2.jar
    case "about.html"                                  => MergeStrategy.rename
    case x => old(x)
  }
}

assemblyCacheOutput in assembly := false
Run Code Online (Sandbox Code Playgroud)

清洁后58秒内完成组装,第二次运行无需清洁需要15秒.虽然有些跑步也需要200多秒.

看一下这个来源,我可能会进行优化cacheOutput,但是现在,关闭它应该会使组装更快.

编辑:

我在添加基于此问题的库依赖项时添加#96性能下降,并在sbt-0.10.1中为sbt 0.13 添加了一些修复.

sbt-assembly 0.10.1避免了依赖库jar的解压缩项的内容散列.它还跳过sbt完成的jar缓存,因为sbt-assembly已经缓存了输出.

这些更改使装配任务更加一致.使用deps-heavy spark作为样本项目,在一个小的源更改后,组装任务运行了15次.sbt-assembly 0.10.0需要19 +/- 157秒(大多数在20秒内,但是运行时间超过150+秒26%).另一方面,sbt-assembly 0.10.1耗时16 +/- 1秒.