Spark-Shell与Spark-Submit在Yarn客户端模式下Executor配置不一致问题咨询
解决Spark-Shell与Spark-Submit在Yarn客户端模式下的配置差异问题
我之前碰到过好几个类似的案例,这种差异一般和配置加载优先级、提交命令的隐性参数或者运行环境权限有关,咱们一步步来排查解决:
1. 先验证Spark-Submit是否真的没读取到spark-defaults.conf
你可以给Spark-Submit加个--verbose参数,看看它实际加载的配置细节:
spark-submit --verbose --class 你的主类名 你的应用jar包
在输出里找到Spark Properties区块,检查spark.executor.instances的值是不是还是2。如果确实没读到配置,那基本就是配置加载优先级的问题了。
2. 排查配置加载优先级的坑
Spark的配置加载是有明确优先级的:命令行参数 > 提交时指定的--properties-file > spark-defaults.conf > 系统环境变量。你需要确认:
- 你的Spark-Submit命令里有没有隐性传递
--num-executors 2或者spark.executor.instances=2这类参数?比如是不是用了封装脚本,里面偷偷加了这些配置? - 提交时有没有指定其他
--properties-file参数,覆盖了默认的spark-defaults.conf?
3. 确认两种运行方式的环境一致性
有时候用户会用不同用户或者不同环境变量运行Spark-Submit和Spark-Shell:
- 检查运行Spark-Submit的用户有没有读取
$SPARK_HOME/conf/spark-defaults.conf的权限?比如Spark-Shell用root跑,Spark-Submit用普通用户,就可能因为权限问题读不到配置。 - 对比两种运行场景下的
$SPARK_HOME环境变量是否一致?运行前先执行echo $SPARK_HOME确认。
4. 强制指定参数做验证(临时方案+问题定位)
如果前面排查没结果,可以在Spark-Submit命令里显式指定Executor数量,看看能不能正常运行:
spark-submit --class 你的主类名 --num-executors 5 你的应用jar包
如果这样能成功创建5个Executor并正常运行,那说明确实是默认配置没被加载,回到前面的步骤继续排查配置加载问题;如果还是不行,那大概率是Yarn资源不足或者应用本身的问题,得去看Yarn的日志(比如yarn logs -applicationId <你的应用ID>)进一步定位。
5. 检查Yarn队列的资源限制
还有一种可能:Spark-Shell和Spark-Submit提交到了不同的Yarn队列,而目标队列的资源上限就是2个Executor。你可以检查:
spark-defaults.conf里有没有配置spark.yarn.queue?- Spark-Submit命令里有没有用
--queue参数指定了不同的队列?
内容的提问来源于stack exchange,提问作者Akinwale
相关产品推荐
相关产品推荐

