使用spark-submit提交到的各個模式

使用spark-submit提交到yarn上遇到的第三方jar包的問題

spark-submit on yarn cluster can’t use third-party libraries


本地運行jar包方式

spark@host1$ java -cp exmple1.jar:exmple2.jar:....:yourApplication.jar  com.test.YourMainClass

這裏使用”:”分割

spark local 模式運行application

spark@host1$ spark-submit \
--master local \ 
--jars exmple1.jar,exmple2.jar \ #這裏配置jars
--class com.test.YourMainClass \
target/yourApplication.jar

這裏使用”,”分割

與local模式一樣yarn-client模式提交

spark@host1$ spark-submit \
--master yarn \ 
--deploy-mode client \
--jars exmple1.jar,exmple2.jar \
--class com.test.YourMainClass \
target/yourApplication.jar

使用yarn-cluster模式提交

重點來了,再yarn-cluster模式下怎麼提交第三方jar包呢?
經過測試發現,使用上面client的同樣的方式提交application是不行的。
原因是client模式下程序driver是在本機的所以,程序運行時可以在本地找到依賴的jar包。
而再cluster模式下driver所在的機器是由yarn隨機分配的,所以當分配的機器不是本地機器時,程序將會找不到所需要的jar包而出錯。當然如果你運氣足夠好,正好yarn分配的driver是再本機的node,就不會出錯。

如何避免這種問題呢?
一種方法是把你需要的第三方jar包在所有的Slave節點的相同路徑下都放一份。
當然這個方法在集羣規模較大的情況下不太現實。
另一種方法就是把jar包放在hdfs等分佈式文件系統中,保證所有的節點都能拿到這些jar包。

spark@host1$ spark-submit \
--master yarn \
--deploy-mode cluster\
--jars hdfs://myApplication/exmple1.jar,hdfs://myApplication/exmple2.jar \
--class com.test.YourMainClass \
target/yourApplication.jar

關於爲何使用client模式可以提交的方式,卻不能在cluster模式運行的bug,有人在issues.apache.org反映過這個情況,最後官方的回覆說不會修復,不按bug處理關閉了這個問題,具體如下:

https://issues.apache.org/jira/browse/SPARK-10789

有什麼問題歡迎留言一起討論。

參考文獻

http://blog.csdn.net/a95473004/article/details/53886010
http://spark.apache.org/docs/latest/submitting-applications.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章