我尝试使用hortonworks-spark/shc来汇编Scala 2.11 Spark 2.0应用程序。
依赖项集看起来很简单:
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.0.2" % "provided",
"com.hortonworks" % "shc-core" % "1.0.1-2.0-s_2.11"
)
当我尝试将应用程序组装到胖罐中时,问题出现了,因为有很多具有不同版本的瞬态依赖性,然后汇编插件抛出了重复错误。一个示例:
deduplicate: different file contents found in the following:
[error] /home/search/.ivy2/cache/org.mortbay.jetty/jsp-2.1/jars/jsp-2.1-6.1.14.jar:org/apache/jasper/xmlparser/XMLString.class
[error] /home/search/.ivy2/cache/tomcat/jasper-compiler/jars/jasper-compiler-5.5.23.jar:org/apache/jasper/xmlparser/XMLString.class
另外,我不知道它是否正确包含在org.apache.hbase等jar依赖项中:hbase-server:1.1.2
因此,基本上,问题是:有人知道使用此库和SBT组装Scala Spark应用程序的正确方法,并且可以提供一个示例?(也许将其添加到hortonworks spark/shc
的文档中注意:hortonworks spark/shc不包含在火花包装中,因此,如果不与罐子的本地副本一起使用 - 包装选项。我正在使用EMR,所以我没有一个预配置的群集,其中复制jar而不增加部署的复杂性。
您应该指定readme中提到的Mergestrategy。您可以在火花节点上提供常见的库,而不是每次将它们包括在fat.jar中。这样做的路是将它们上传到每个工人上并添加到ClassPath。
您可以看到jasper-xmlparser正在使用两个不同的罐子。所以重复。您可以将参考排除在其中一个,如下所示
例如:library Depentencies =" org.apache.hbase"%" hbase-server"%" 0.98.12-HADOOP2" DESSUBLUDEALL DEXBUSIONR(组织=" org.mortbay.jetty")
以及将所有依赖项添加到胖罐中,至少是用于火花应用的,这是处理罐子组件的建议方法。最常见的罐子(例如Spark,HBase等)可以成为边缘节点上类路径的一部分或您正在运行的节点。任何其他特定的罐子,都可以成为Uber Jar的一部分。您可以按照提供的火花/HBase罐子。
很好,核心应帮助您进行基本操作。
libraryDependencies += "org.apache.hbase" % "hbase-client" % "0.98.12-hadoop2" // % "provided"
libraryDependencies += "org.apache.hbase" % "hbase-common" % "0.98.12-hadoop2" //% "provided"
libraryDependencies += "org.apache.hbase" % "hbase-server" % "0.98.12-hadoop2" excludeAll ExclusionRule(organization = "org.mortbay.jetty")
您必须在build.sbt中提供Mergentrategy,
看起来像这样,
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case "reference.conf" => MergeStrategy.concat
case x => MergeStrategy.first
}
在此示例中,我指定了 Mergestrategy.first 。还有其他选项,例如 Mergestrategy.last 和 Mergestrategy.concat
Mergestrategy.First意味着它将为创建Uber Jar的给定依赖项选择它看到的第一个罐子。
在某些情况下可能行不通,如果是这样,请尝试Mergestrategy.last也。