Spark任务分配异常咨询:5分区全跑单节点,其余从节点闲置如何解决?
Spark集群任务集中单节点的原因及解决方法
可能的原因
数据局部性优先调度
Spark默认以减少数据传输为核心调度逻辑,会优先把任务分配到数据所在的节点。如果你的5个数据分区对应的数据源(比如HDFS块、本地文件)都存储在同一台Slave节点上,所有任务都会被调度到该节点执行,其他节点自然闲置。Executor未均匀分布到Slave节点
你设置了--num-executors 5,但可能出现所有Executor都启动在同一台Slave的情况:- 部分Slave节点的Spark Worker服务未正常向Master注册,或者Worker的
cores/memory配置被限制,无法容纳1个需要6核+6G内存的Executor; - Spark默认的FIFO调度策略在资源充足时,可能优先在同一节点复用资源(尽管单节点资源刚好只能装1个Executor,但可能存在配置识别偏差)。
- 部分Slave节点的Spark Worker服务未正常向Master注册,或者Worker的
分区生成逻辑绑定节点
如果数据分区是在Driver端生成后,被序列化到某一个节点的Executor上,后续任务调度会优先复用该节点资源,导致任务集中。
解决方法
1. 先验证Executor分布
打开Spark UI的Executors页面(默认地址http://<Master节点IP>:4040),确认5个Executor是否分别运行在5台Slave节点:
- 如果Executor集中在一个节点:检查所有Slave的Worker服务状态,确保Worker的
spark-worker-cores和spark-worker-memory配置足够容纳1个Executor(你的节点配置刚好匹配),重启未正常注册的Worker。
2. 调整数据局部性优先级
如果是数据局部性导致的任务集中,添加配置跳过局部性等待,强制Spark分散任务:
修改spark-submit命令,增加:
--conf spark.locality.wait=0s
该配置会让Spark不等待局部性匹配,直接将任务分配到空闲Executor,以少量数据传输开销换取任务均衡。
3. 优化分区与数据源分布
- 如果读取本地文件:将文件分散到各个Slave节点的本地存储,避免集中在单节点;
- 如果读取分布式存储(如HDFS):确保文件被切分成均匀分布的块,分散在各个DataNode;
- 在代码中通过
repartition(5)重新分区,强制Spark将数据打散到不同节点的Executor。
4. 切换到公平调度器
修改Spark调度策略为公平调度,确保资源被均匀分配:
- 创建
fair-scheduler.xml文件:
<?xml version="1.0"?> <allocations> <pool name="default"> <schedulingMode>FAIR</schedulingMode> <weight>1</weight> <minShare>1</minShare> </pool> </allocations>
- 在
spark-submit中添加配置:
--conf spark.scheduler.mode=FAIR --conf spark.scheduler.allocation.file=/path/to/fair-scheduler.xml
内容的提问来源于stack exchange,提问作者Edd
相关产品推荐
相关产品推荐

