使用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处理关闭了这个问题,具体如下:
有什么问题欢迎留言一起讨论。
参考文献
http://blog.csdn.net/a95473004/article/details/53886010
http://spark.apache.org/docs/latest/submitting-applications.html