spark on hdp yarn cluster踩坑jerse
现在hdp 3版本中自带的jersey版本已经是1.19,而我所用的spark3.1.1自带的jersey版本已经是2.30了。
在《Spark在HDP Yarn的提交与正常通信》一文中我们知道使用开源spark提到hdp yarn时需要替换2个包:jersey-client和jersey-core,版本均为1.19。这种解决办法是可行的,对代码也没有什么侵入性。但是技术上不怎么优雅,且需要去每个spark目录下替换这个jersey包。
方案1:就是换jar包,如果用户没有遇到其他异常,这样就行。
方案2:如果不使用timeline-service,那么设置YARN服务的yarn.timeline-service.enabled
配置为false
,这个ClientConfig
错误也会消失。设置这个参数的提示会在启动spark-sql
或spark-shell
报错时直接提示你这么修改。
![](https://img.haomeiwen.com/i26345935/fbb07c0457329fce.png)
注意:这里是公共参数!
方案3:在提交任务时指定classpath包含所需版本的jersey-client来解决。具体就是在spark-submit
命令行增加--conf spark.driver.extraClassPath=/path-to-jar/jersey/* --conf spark.executor.extraClassPath=/path-to-jar/jersey/*
。这样可以不用把jar包拷贝到每个节点。请预先把1.19版本的jersey jar放置在你配置的路径下(修改/path-to-jar/jersey)。
最佳方案:
hdp原装的spark2可以正常提交任务,是因为修改了源码,在提交任务时追加参数设置yarn.timeline-service.enabled
为false
,那么我们也要重新编译spark源码吗?答案是不需要!
spark-submit命令行增加 --conf spark.hadoop.yarn.timeline-service.enabled=false
,只影响当前任务,比方案2更优雅。
根据我们的实测结果,使用最佳方案完全OK。
如果想改Spark源码一劳永逸的解决,修改的地方是src/main/scala/org/apache/spark/deploy/SparkHadoopUtil.scala,在第447行增加hadoopConf.set("yarn.timeline-service.enabled", "false")
。
为什么要替换这个包,WestC同学在Spark on hdp yarn cluster踩坑(timeline-service)中有排查过程。
点:spark on yarn、debug、jersey-client
线:Spark
面:资源调度
不积跬步无以至千里;不积小流无以成江海