2013-10-23 5 views
6

私はscalaでの展開に新しく、sbt-assemblyプラグインを構成しました。依存関係を追加した後にsbtアセンブリタスクがゆっくり実行される

何日か前にhadoop、sparkなどの依存関係を追加した後、assemblyタスクは非常に遅くなり(8〜10分)、その前には< 30秒になりました。 ほとんどの場合、アセンブリjarの生成に使用されます(jarファイルのサイズが1MBになるまで数秒かかる)。

私は、first戦略によって解決される多くのマージの競合があることがわかりました。これは組み立てのスピードに影響しますか?

私はsbt(-Xmx4096mを追加)の-Xmxオプションを使用しましたが、それは役に立ちません。

私はsbt 12.4とsbt-assemblyを使用しています。このタスクを最適化するための提案や指針はありますか?

+2

[Readme](https://github.com/sbt/sbt-assembly)を読んだことはありますか?具体的には、あなたが 'cacheUnzip'と' cacheOutput'設定を変更するかもしれないことを示唆しています。私はそれを試してみるだろう。 –

+0

@ 0__私はそれを読んだが、すべての最適化オプションはデフォルトでオンになっているようだ。 – darkjh

+0

はい、しかし、それらは_options_です。違いがあるかどうかを確認するために、キャッシングオプション_off_のそれぞれを切り替えることは価値があるかもしれません。 –

答えて

6

ので0__のコメントは右側にある:

あなたがReadmeを読みました。具体的には、cacheUnzipcacheOutputの設定を変更する可能性があります。私はそれを試してみるだろう。

cacheUnzipcacheOutputではありません。 cacheOutputの目的は、ソースが変更されていない場合でも同じjarファイルを取得できるようにすることです。一部の人にとっては、出力ジャーが不必要に変更されないことが重要です。警告は、すべての* .classファイルのSHA-1ハッシュをチェックしていることです。だから、READMEは言う:

クラスファイルの数が多い場合には、これは私が言うことができるものから

長い時間がかかることがあり、一緒に解凍およびマージ戦略を適用する分を中心に取り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 

は、アセンブリは、クリーニング後58秒で終了し、クリーニングなしのセカンドランは15秒かかりました。ランのいくつかは200+秒もかかりましたが。ソースを見ると

、私はおそらくcacheOutputを最適化することができますが、今のところ、それをオフにすると、アセンブリはるかに高速にする必要があります。

編集

私はこの質問に基づいて#96 Performance degradation when adding library dependenciesを追加し、SBT 0.13のためにsbt-assembly 0.10.1にいくつかの修正を追加しました。

sbt-assembly 0.10.1は、依存ライブラリのjarファイルの解凍された項目のコンテンツハッシングを防ぎます。また、sbt-assemblyはすでに出力をキャッシュしているので、sbtによって行われたjarキャッシングをスキップします。

変更により、アセンブリタスクがより一貫して実行されます。 deps-heavy sparkをサンプルプロジェクトとして使用して、小さなソース変更後に15回のアセンブリタスクを実行しました。 sbt-アセンブリ0。10.0は19 +/- 157秒(主に20秒以内でしたが、実行時間は150+秒26%)でした。一方、sbt-assembly 0.10.1は16 +/- 1秒かかった。