因为要用spark2.0,而集群上cdh5.7.1的spark版本是1.6的,在单独使用spark2.0的时候出现了hbase包找不到的问题,因为spark-submit –jars属性引的包太多,就干脆直接用sbt将相关的jar包打成fat-jar,期间遇到了一些问题,在此记录一下。
开发环境使用的是idea,装了sbt插件后以为就可以直接在terminal命令窗口中直接运行sbt了,但实际上会告诉你sbt是未知的命令。
解决办法如下:先去sbt官网下了windows(.msi)版的sbt,下载地址。
下载完之后在path中配置环境变量:
;C:\Program Files (x86)\sbt\bin
在
\.sbt\0.13
目录下创建文件夹plugins
,然后创建plugins.sbt
文件,用atom编辑,添加如下代码,添加sbt-assembly插件:resolvers += "bintray-sbt-plugins" at "http://dl.bintray.com/sbt/sbt-plugin-releases"
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.13.0")打开idea下面的Terminal窗口,并键入sbt进入sbt shell
进入之后,可以看到先加载全局的sbt配置文件,然后加载你的项目定义中的sbt配置文件
在sbt-shell中键入assembly进行fat-jar打包,期间遇到了deduplicatded错误,是因为存在jar包冲突导致的,可以用sbt的merge方案解决。在项目的
build.sbt
文件中添加如下代码,这个要根据不同项目产生的不同的重复问题进行修改。// 解决jar包冲突(deduplicate)问题
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("org", "w3c", xs@_*) => MergeStrategy.last
case PathList("com", "google", xs@_*) => MergeStrategy.last
case PathList("com", "codahale", xs@_*) => MergeStrategy.last
case PathList(ps@_*) if ps.last endsWith ".html" => MergeStrategy.first
case "log4j.properties" => MergeStrategy.last
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}执行assembly之后结果如下
如果修改了项目中
build.sbt
文件,要重新打包,记得先关闭Terminal窗口,然后打开新的Terminal窗口重新执行sbt,以确保sbt更新配置信息,否则打包执行的还是未修改之前build.sbt
的配置信息