通常我們將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包
方法二: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包很大。