Spark任務提交jar包依賴解決方案
阿新 • • 發佈:2019-01-02
通常我們將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包很大。