我尝试使用hortonworks spark/shc组装一个scala2.11spark2.0应用程序来访问hbase。
依赖项集看起来很简单:
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.0.2" % "provided",
"com.hortonworks" % "shc-core" % "1.0.1-2.0-s_2.11"
)
当我尝试在一个胖jar中组装应用程序时,问题就来了,因为有很多不同版本的临时依赖关系,那么组装插件就会抛出重复的错误。举个例子:
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
另外,我也不知道在jar依赖项中包括org.apache是否正确。hbase:hbase-server:1.1.2
所以,基本上,问题是:任何人都知道使用这个库和sbt组装scala spark应用程序的正确方法,并且能提供一个例子吗(也许可以在hortonworks spark/shc的文档中添加它
注意:hortonworks spark/shc不包含在spark包中,因此如果没有jars的本地副本,我就不能使用--packages选项。我使用的是emr,所以我没有一个预先配置的集群,可以在不增加部署复杂性的情况下复制jar。
3条答案
按热度按时间piok6c0g1#
正如您所看到的,jasperxmlparser正被两个不同的jar使用。所以复制品。您可以从其中一个中排除引用,如下所示
例如:librarydependencies+=“org.apache.hbase”%”“hbase server”%”“0.98.12-hadoop2”excludeall exclusionrule(organization=“org.mortbay.jetty”)
关于将所有依赖项添加到fatjar,至少对于spark应用程序,这是处理jar程序集的建议方法。最常见的jar(如spark、hbase等)可以成为边缘节点或正在运行的节点的类路径的一部分。任何其他特定的jar,都可以是uberjar的一部分。您可以按照提供的方式制作spark/hbase jar。
好的,在核心,下面应该帮助你做基本的操作。
yrdbyhpb2#
必须在build.sbt中提供合并策略,
看起来像这样,
在本例中,我指定了mergestrategy.first。像mergestrategy.last和mergestrategy.concat这样的选项很少
mergestrategy.first意味着它将为给定的依赖项选择它看到的第一个jar来创建一个uber jar。
对于某些情况,它可能不起作用,如果是这种情况,请尝试与mergestrategy.last也。
vu8f3i0k3#
您应该指定自述文件中提到的合并策略。您可以在spark节点上提供公共库,而不是每次都将它们包含在fat.jar中。最简单的方法是将它们上传到每个worker并添加到classpath。