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

Scala 添加一些依赖项后,sbt程序集任务运行缓慢,scala,deployment,sbt,apache-spark,sbt-assembly,Scala,Deployment,Sbt,Apache Spark,Sbt Assembly,我对scala中的部署有点陌生,我配置了sbt assembly插件,一切都很好 几天前,我添加了hadoop、spark和其他一些依赖项,然后汇编任务变得非常慢(8到10分钟),在此之前,它是MergeStrategy.first//commons-beanutils-core-1.8.0.jar vs commons-beanutils-1.7.0.jar 案例路径列表(“com”、“深奥软件”、“minlog”、xs@*)=>MergeStrategy.first//kryo-2.21.j

我对scala中的部署有点陌生,我配置了
sbt assembly
插件,一切都很好

几天前,我添加了hadoop、spark和其他一些依赖项,然后
汇编任务变得非常慢(8到10分钟),在此之前,它是<30秒大部分时间用于生成程序集jar(jar的大小增长1MB需要几秒钟)。

我注意到有很多合并冲突,这些冲突是通过
first
策略解决的。这会影响装配速度吗

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

我正在使用
sbt
12.4和
sbt组件
。有没有关于优化此任务的建议或指针?

So的评论如下:

你读过报纸了吗。它特别建议您更改
cacheUnzip
cacheOutput
设置。我想试试

cacheUnzip
是一种优化功能,但
cacheOutput
不是。
cacheOutput
的目的是在源代码未更改时获得相同的jar。对于一些人来说,重要的是输出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
import AssemblyKeys.\u//将其放在文件的顶部
装配设置
在assembly mergeStrategy.first中使用mergeStrategy
案例路径列表(“org”、“apache”、“commons”、xs@*)=>MergeStrategy.first//commons-beanutils-core-1.8.0.jar vs commons-beanutils-1.7.0.jar
案例路径列表(“com”、“深奥软件”、“minlog”、xs@*)=>MergeStrategy.first//kryo-2.21.jar vs minlog-1.2.jar
案例“about.html”=>MergeStrategy.rename
案例x=>旧(x)
}
}
程序集中的assemblyCacheOutput:=false
清洁后,组装在58秒内完成,第二次不清洁运行耗时15秒。虽然有些跑步也需要200多秒

查看源代码,我可能可以优化
cacheOutput
,但现在,关闭它应该会使汇编速度更快

编辑

我已经根据这个问题添加了,并在sbt 0.13中添加了一些修复

sbt assembly 0.10.1避免了对依赖库JAR的解压缩项进行内容哈希。它还跳过了sbt完成的jar缓存,因为sbt程序集已经在缓存输出

这些更改使部件任务的运行更加一致。使用deps heavy spark作为示例项目,在一次小的源代码更改后,组装任务运行了15次。sbt组装0.10.0需要19+/-157秒(大部分时间在20秒内,但运行150秒以上的时间占运行时间的26%)。另一方面,sbt组件0.10.1花费了16+/-1秒


对于每个添加的库依赖项,组装过程必须解压缩所有归档文件,然后将内容重新打包到胖jar中

这个过程是I/O密集型的,如果你有防病毒软件,它会扫描每个文件

对我有效的方法是将项目目录添加为防病毒设置中的排除的文件夹,这将组装时间从60秒更改为12秒

此外,如果使用前面的~运行assembly命令,则如下所示:

sbt ~assembly
然后sbt将等待项目中的源代码更改,然后在不重新加载JVM的情况下进行打包


这将组装时间从12秒减少到了8秒(具有两个库依赖项的小项目)。

您是否阅读了。它特别建议您更改
cacheUnzip
cacheOutput
设置。我想试一试。@0\uuuu我已经读过了,但似乎所有的优化选项都默认打开了是的,但它们都是选项。可能值得尝试关闭每一个缓存选项,看看它是否有区别。我尝试了两个选项的组合,但似乎无法解决问题。然而,有时如果我先做一个清理,组装会非常快,但这种行为并不一致。那么最好是在项目页面上提交一个问题,并希望得到作者的反馈。。。