Spark2.3在YARN集群部署模式下spark-submit提交任务参数被截断问题
问题根因
这个问题是Spark 2.3与Hadoop 2.7.3版本组合下的已知转义bug:
- YARN cluster模式运行时,Spark Driver进程会在YARN节点上由
launch_container.sh脚本拉起,脚本生成过程中Spark的参数转义逻辑对连续闭合的大括号}}处理异常,会把第二个}识别为脚本语法的结束标记,直接截断后续内容,最终导致传入主类的参数不完整 - client模式下Driver进程在提交节点本地启动,参数不需要经过YARN脚本的二次转义,因此传递正常
解决方案
提供3种可行的修复方案,可根据实际场景选择:
- 参数转义规避(无需改代码/升级版本)
提交命令中对JSON参数的连续闭合大括号做额外转义,把原有参数'{"sample":{}}'修改为'{"sample":{}\\}'即可正常传递完整JSON。
修改后的完整提交命令如下:
spark-submit --conf spark.executor.memory=24g --conf spark.master=yarn --conf spark.submit.deployMode=cluster --conf spark.executor.extraJavaOptions=-Dfile.encoding=UTF-8 --conf spark.files=file:///opt/configurations/app.conf --class com.example.HelloWorld --queue sample_q file:///opt/jars/example.jar '{"sample":{}\}'
Base64编码传递(彻底规避转义问题)
如果需要传递的JSON结构复杂,转义容易出错,可以先把JSON内容做Base64编码后作为参数传递,在HelloWorld主方法中先对入参做Base64解码再使用,完全避开特殊字符转义问题。版本升级(永久修复)
升级Spark到2.4及以上版本,或是升级Hadoop到2.8及以上版本,这两个版本分支均已修复该参数转义bug,升级后原有提交命令无需修改即可正常运行。
内容的提问来源于stack exchange,提问作者PRASANNA SARAF
相关产品推荐
相关产品推荐

