Spark独立集群3个Worker节点指定Executor分配方案咨询
Spark Standalone集群手动分配Executor及YARN方案
针对Standalone集群的手动分配方案
方式1:标签绑定精确指定每个Worker的Executor数
Spark 2.4.4支持给Worker节点打专属标签,提交任务时通过标签约束Executor的分配:
- 给三台Worker分别打唯一标签:
启动Worker时添加标签参数,比如给第一台执行:
另外两台分别设置./spark-worker.sh spark://master:7077 --labels node=node1--labels node=node2和--labels node=node3,也可以在spark-env.sh里配置SPARK_WORKER_OPTS="--labels node=nodeX"永久生效。 - 提交任务时指定每个标签对应的Executor数量:
这里给每个Worker分配8个Executor(24/3),强制让负载均匀分布到三台机器。spark-submit \ --master spark://master:7077 \ --total-executor-cores 120 \ --executor-memory 8G \ --conf spark.executor.instances=24 \ --conf spark.executor.nodeAffinity.node.node1=8 \ --conf spark.executor.nodeAffinity.node.node2=8 \ --conf spark.executor.nodeAffinity.node.node3=8 \ your-application.jar
方式2:限制单Worker的Executor上限
如果不需要精确指定每个Worker的数量,只需要避免某台Worker被占满,可以给每个Worker设置最大可分配的Executor数:
启动Worker时添加--max-executors 8参数,或者在spark-env.sh中配置SPARK_WORKER_OPTS="--max-executors 8",这样每个Worker最多只能分配8个Executor,24个Executor自然会均匀分到三台机器上。
YARN集群的解决方案
YARN的资源调度机制天生更擅长均衡负载,能解决你遇到的问题:
- 默认的CapacityScheduler会自动将Spark Executor对应的YARN Container分散到不同的NodeManager上,避免单节点负载过高;
- 如果需要精确控制,可以给YARN的NodeManager打节点标签,通过队列配置或任务提交参数指定Executor的节点分配规则;
- 另外,通过配置YARN单节点的最大CPU/内存资源上限,配合Spark的
--executor-cores、--executor-memory参数,能更灵活地控制每个节点的负载。
内容的提问来源于stack exchange,提问作者Andreas Lampropoulos
相关产品推荐
相关产品推荐

