如何在YARN上让Spark Executors均匀分布于集群节点?
解决Spark Executor在YARN上集中调度的问题
要让30个Executor尽可能分散到不同节点(甚至机架),可以通过以下几种方式将YARN放置约束传递给Spark应用:
1. 提交Spark应用时直接指定约束
Spark on YARN支持通过--conf参数传递YARN的应用级放置约束,核心是配置yarn.applications.placement-constraints项。
提交命令示例:
spark-submit \ --class com.your.package.YourApp \ --master yarn \ --deploy-mode cluster \ --num-executors 30 \ --conf yarn.applications.placement-constraints="myapp=30,NOTIN,NODE,myapp" \ your-app.jar
- 其中
myapp是自定义的约束标识,建议设置为唯一值,避免和其他应用的约束冲突 - 数字
30需与num-executors保持一致,确保所有Executor都应用该分散规则
2. 队列级全局配置(适用于同队列所有应用)
如果需要让某个YARN队列下的所有Spark应用默认启用分散放置,可修改队列的调度配置:
- 容量调度器:在
capacity-scheduler.xml中添加队列配置
<property> <name>yarn.scheduler.capacity.root.your-queue.placement-constraints</name> <value>myapp=30,NOTIN,NODE,myapp</value> </property>
- 公平调度器:在
fair-scheduler.xml中对应队列添加配置
<queue name="your-queue"> <placement-constraints>myapp=30,NOTIN,NODE,myapp</placement-constraints> </queue>
修改后重启YARN资源管理器生效,后续提交到该队列的应用会自动应用约束。
3. 实现机架级分散的调整
如果需要进一步将Executor分散到不同机架,只需将约束中的NODE替换为RACK:
--conf yarn.applications.placement-constraints="myapp=30,NOTIN,RACK,myapp"
注意:需确保YARN集群已正确配置机架感知(节点的机架拓扑信息已通过topology.mapfile或拓扑脚本定义)。
关键注意事项
- 若集群节点资源不足以承载单个Executor,YARN会优先保证应用启动而忽略约束,需提前确认节点资源充足
- 约束标识
myapp可自定义,只要保证在集群内唯一即可 - 队列级配置会对该队列下所有应用生效,适合统一管控的场景
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

