使用sbt assembly构建Spark项目

来源:互联网 发布:divide into python 编辑:程序博客网 时间:2024/04/28 00:08

sbt-assembly是一个sbt插件,作用类似于Maven,用于创建一个包含依赖的JAR包

场景:我在用sbt构建spark项目,但是在用sbt package打包生成jar包时,这个jar包并不没有包含项目的依赖,导致这个jar包提交到spark集群运行时,worker不能找到相应的类,sbt-assembly这个插件可以解决这个问题,可以将项目的依赖一同打包进jar包里。

我的Spark项目目录为:

MyProject....project........plugins.sbt....src....target....build.sbt

1、增加插件

在文件plugins.sbt里增加以下代码(其中,第一行是自带的):

logLevel := Level.WarnaddSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")

注意:这里有个版本号,要特别小心,不同版本的sbt,对应到不同的sbt-assembly版本,如果版本不对,插件无效还好受一点,遇到一些莫名奇妙的问题,想哭都找不到地。版本的对应情况可参考官方
我的sbt版本为0.13,所以,对应的sbt-assembly版本为0.11.2。如果你装了sbt,但不知道版本的话,可以用以下命令查看版本:

yang@master:$ sbt sbtVersion[info]......[info] 0.13.0

2、创建assembly.sbt文件

在MyProject根目录下创建assembly.sbt文件,创建之后,文件目录如下:

MyProject....project........plugins.sbt....src....target....build.sbt....assembly.sbt

然后在assembly.sbt文件中加入以下代码:

// put this at the top of the fileimport AssemblyKeys._assemblySettings// 这个是打包之后jar包的名字jarName in assembly := "myproject-assembly-1.0.jar"// 这个作用是在打包的时候,跳过测试test in assembly := {}

3、排除一些不必要的依赖

在我的build.sbt文件里有以下依赖,但是,在Spark集群中,每个worker都有spark-core和spark-sql的依赖,因此,在打包我们的spark应用时,这两个包可以不放进jar包,所以,我们可以使用%”provided”来排除不想放进JAR包的依赖,如下所示:

libraryDependencies ++= Seq(  "junit" % "junit" % "4.12" % "test",  "com.novocode" % "junit-interface" % "0.11" % "test",  "org.apache.spark" %% "spark-core" % "1.6.0" % "provided",  "org.apache.spark" % "spark-sql_2.10" % "1.6.0" % "provided",  "mysql" % "mysql-connector-java" % "5.1.38")

注意:这里把spark-sql依赖后面也加了%”provided”,可能会导致本地在IDE里运行spark程序找不到类,这个时候,把这个%”provided”去掉就好,等到需要 sbt assembly的时候,再加上。当然,不加%”provided”直接sbt assembly也可以,只是需要处理一些冲突.

4、使用sbt assembly打包

切换到MyProject根目录下,使用以下命令:

yang@master:~$ sbt assembly[info] Loading project definition from......(省略)[info] Packaging /home/yang/IdeaProjects/MyProject/target/scala-2.10/myproject-assembly-1.0.jar ...[info] Done packaging.[success] Total time: 2 s, completed Aug 21, 2016 4:11:54 PM

此时,我们看到,myproject-assembly-1.0.jar已经打包好了,ready to rock! ^_^

参考:
[1] https://github.com/sbt/sbt-assembly

0 0