Spark sbt-assembly 打包

因为要用spark2.0,而集群上cdh5.7.1的spark版本是1.6的,在单独使用spark2.0的时候出现了hbase包找不到的问题,因为spark-submit –jars属性引的包太多,就干脆直接用sbt将相关的jar包打成fat-jar,期间遇到了一些问题,在此记录一下。

  • 开发环境使用的是idea,装了sbt插件后以为就可以直接在terminal命令窗口中直接运行sbt了,但实际上会告诉你sbt是未知的命令。
    解决办法如下:

    1. 先去sbt官网下了windows(.msi)版的sbt,下载地址。

    2. 下载完之后在path中配置环境变量:;C:\Program Files (x86)\sbt\bin

    3. \.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")

    4. 打开idea下面的Terminal窗口,并键入sbt进入sbt shell
      Spark sbt-assembly 打包_第1张图片

    5. 进入之后,可以看到先加载全局的sbt配置文件,然后加载你的项目定义中的sbt配置文件
      Spark sbt-assembly 打包_第2张图片

    6. 在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)
      }

    7. 执行assembly之后结果如下
      Spark sbt-assembly 打包_第3张图片

    8. 如果修改了项目中build.sbt文件,要重新打包,记得先关闭Terminal窗口,然后打开新的Terminal窗口重新执行sbt,以确保sbt更新配置信息,否则打包执行的还是未修改之前build.sbt的配置信息

你可能感兴趣的:(sbt)