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),但它没有帮助.
我正在使用sbt
12.4和sbt-assembly
.有关优化此任务的建议或指示吗?
所以0__的评论是正确的:
你读过自述文件吗?它特别建议您可以更改
cacheUnzip
和cacheOutput
设置.我试试看.
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秒.
归档时间: |
|
查看次数: |
2366 次 |
最近记录: |