1. 程式人生 > >Spark任務提交jar包依賴解決方案

Spark任務提交jar包依賴解決方案

通常我們將spark任務編寫後打包成jar包,使用spark-submit進行提交,因為spark是分散式任務,如果執行機器上沒有對應的依賴jar檔案就會報ClassNotFound的錯誤。
下面有三個解決方法:

方法一:spark-submit –jars

根據spark官網,在提交任務的時候指定–jars,用逗號分開。這樣做的缺點是每次都要指定jar包,如果jar包少的話可以這麼做,但是如果多的話會很麻煩。

spark-submit --master yarn-client --jars ***.jar,***.jar(你的jar包,用逗號分隔) mysparksubmit.jar

如果你使用了sbt的話,並且在build.sbt中配置好了依賴並下載完成,那麼你可以直接去使用者home目錄下的.ivy/cache/中拷貝你的jar需要的jar包

方法二:extraClassPath

提交時在spark-default中設定引數,將所有需要的jar包考到一個檔案裡,然後在引數中指定該目錄就可以了,較上一個方便很多:

spark.executor.extraClassPath=/home/hadoop/wzq_workspace/lib/*
spark.driver.extraClassPath=/home/hadoop/wzq_workspace/lib/*

需要注意的是,你要在所有可能執行spark任務的機器上保證該目錄存在,並且將jar包考到所有機器上。這樣做的好處是提交程式碼的時候不用再寫一長串jar了,缺點是要把所有的jar包都拷一遍。

方法三:sbt-assembly

如果你還是覺得第二種麻煩,這種方法是將所有依賴的jar包包括你寫的程式碼全部打包在一起(fat-jar)。在專案根目錄輸入sbt,鍵入plugins,發現assembly並沒有預設安裝,因此我們要為sbt安裝sbt-assembly外掛。
在你的專案目錄中project/plugins.sbt中新增

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.13.0")

resolvers += Resolver.url("bintray-sbt-plugins", url("http://dl.bintray.com/sbt/sbt-plugin-releases"
))(Resolver.ivyStylePatterns)

然後我們再根目錄鍵入sbt,然後使用plugins檢視plugins,如果看到有sbtassembly.AssemblePlugin,說明你的外掛就安成功了:
這裡寫圖片描述
還要設定下衝突解決,然後再在sbt互動命令列下使用assembly就可以了。這種方法打包後會使得jar包很大。