使用sbt assembly構建Spark項目

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.Warn

addSbtPlugin("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 file
import 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

發佈了75 篇原創文章 · 獲贊 57 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章