【问题标题】:spark + sbt-assembly: "deduplicate: different file contents found in the following"spark + sbt-assembly:“去重:在下面找到不同的文件内容”
【发布时间】:2015-08-07 10:40:26
【问题描述】:

我运行了 spark 应用程序并想将测试类打包到 fat jar 中。奇怪的是我成功地运行了“sbt assembly”,但是当我运行“sbt test:assembly”时却失败了。

我试过sbt-assembly : including test classes,但对我的情况不起作用。

SBT 版本:0.13.8

build.sbt:

import sbtassembly.AssemblyPlugin._

name := "assembly-test"

version := "1.0"

scalaVersion := "2.10.5"

libraryDependencies ++= Seq(
  ("org.apache.spark" % "spark-core_2.10" % "1.3.1" % Provided)
    .exclude("org.mortbay.jetty", "servlet-api").
    exclude("commons-beanutils", "commons-beanutils-core").
    exclude("commons-collections", "commons-collections").
    exclude("commons-logging", "commons-logging").
    exclude("com.esotericsoftware.minlog", "minlog").exclude("com.codahale.metrics", "metrics-core"),
  "org.json4s" % "json4s-jackson_2.10" % "3.2.10" % Provided,
  "com.google.inject" % "guice" % "4.0"
)

Project.inConfig(Test)(assemblySettings)

【问题讨论】:

    标签: apache-spark sbt sbt-assembly


    【解决方案1】:

    作为 Wesley Milano 答案的补充,代码需要针对 sbt-assembly 插件的较新版本(即 0.13.0)进行一些调整,以防有人对弃用警告感到疑惑:

    assemblyMergeStrategy in assembly := {
        case PathList("javax", "servlet", xs @ _*) => MergeStrategy.last
        case PathList("javax", "activation", xs @ _*) => MergeStrategy.last
        case PathList("org", "apache", xs @ _*) => MergeStrategy.last
        case PathList("com", "google", xs @ _*) => MergeStrategy.last
        case PathList("com", "esotericsoftware", xs @ _*) => MergeStrategy.last
        case PathList("com", "codahale", xs @ _*) => MergeStrategy.last
        case PathList("com", "yammer", xs @ _*) => MergeStrategy.last
        case "about.html" => MergeStrategy.rename
        case "META-INF/ECLIPSEF.RSA" => MergeStrategy.last
        case "META-INF/mailcap" => MergeStrategy.last
        case "META-INF/mimetypes.default" => MergeStrategy.last
        case "plugin.properties" => MergeStrategy.last
        case "log4j.properties" => MergeStrategy.last
        case x =>
            val oldStrategy = (assemblyMergeStrategy in assembly).value
            oldStrategy(x)
    }
    

    【讨论】:

    • 我已经使用 Scala 一年多了,我不知道这段代码代码是什么,但重要的是它可以工作。谢谢
    • @FelipeAlmeida 您似乎在 spark 方面很有经验,所以我想知道您是否可以帮助我...我正在尝试从我的 SBT 项目中创建一个 jar 文件来运行它。你知道我该怎么做吗?
    • @1290 当然可以。我实际上写过一篇文章:queirozf.com/entries/…
    • spark 2.x.x 需要对此解决方案稍作改动:queirozf.com/entries/…
    【解决方案2】:

    您必须在程序集中定义 mergeStratey,就像我在下面为我的 spark 应用程序所做的那样。

    mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
      {
        case PathList("javax", "servlet", xs @ _*) => MergeStrategy.last
        case PathList("javax", "activation", xs @ _*) => MergeStrategy.last
        case PathList("org", "apache", xs @ _*) => MergeStrategy.last
        case PathList("com", "google", xs @ _*) => MergeStrategy.last
        case PathList("com", "esotericsoftware", xs @ _*) => MergeStrategy.last
        case PathList("com", "codahale", xs @ _*) => MergeStrategy.last
        case PathList("com", "yammer", xs @ _*) => MergeStrategy.last
        case "about.html" => MergeStrategy.rename
        case "META-INF/ECLIPSEF.RSA" => MergeStrategy.last
        case "META-INF/mailcap" => MergeStrategy.last
        case "META-INF/mimetypes.default" => MergeStrategy.last
        case "plugin.properties" => MergeStrategy.last
        case "log4j.properties" => MergeStrategy.last
        case x => old(x)
      }
    }
    

    【讨论】:

    • 把所有这些东西放在sbt文件中,并添加更多的“exclude(...)”子句,可以生成jar并且测试类也在jar中,但是我发现“提供”没有不工作
    • "provided" 仅在您通过 spark-submit 提交 Spark 应用程序时才需要。如果你直接运行你的 spark 应用,不要使用“provided”。
    猜你喜欢
    • 2017-10-18
    • 1970-01-01
    • 2017-12-30
    • 2016-03-16
    • 2018-10-04
    • 2015-05-22
    • 2017-05-21
    • 1970-01-01
    • 2016-03-22
    相关资源
    最近更新 更多