You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Spark集群并行任务故障求助:仅单Worker执行任务

排查Spark集群仅单个Worker执行任务的问题

嗨,我来帮你捋捋这个问题——集群明明有9个Slave节点,但任务只跑在单个Worker上,这种情况我碰到过好多次,咱们一步步排查:

1. 先确认所有Slave节点都成功注册到Master

首先打开Master节点的Spark Web UI(默认地址是http://<master-node-ip>:8080),看看页面里的Workers列表:

  • 是不是9个Slave都显示为ALIVE状态?如果有节点没注册,先检查:
    • Slave节点的spark-env.sh里有没有正确配置Master地址:export SPARK_MASTER_URL=spark://<master-hostname>:7077
    • Slave节点的Spark服务有没有正常启动(执行./sbin/start-slave.sh后查看日志)
    • 节点间的防火墙有没有放行7077(Master监听端口)、8081(Worker UI端口)这些通信端口

2. 提交应用时必须指定足够的资源参数

默认情况下,Spark提交任务的资源配置非常保守,很可能只申请了单个executor,导致任务只跑在一个Worker上。提交时一定要显式指定资源:
比如用spark-submit时加上这些参数:

spark-submit \
  --num-executors 8 \  # 留1个Slave节点备用,避免资源耗尽
  --executor-memory 512m \  # 每个节点只有1G内存,给executor分配一半,留足系统内存
  --total-executor-cores 18 \  # 假设每个Slave有2核,根据你的节点实际核数调整
  --class com.YourMLClass your-application.jar

另外,代码里也要设置合适的并行度:

  • 对于ML任务:spark.conf.set("spark.default.parallelism", 18)(和总executor核数对应)
  • 对于WordCount:读取文件时显式指定分区数,比如sc.textFile("/path/to/input", minPartitions=18)——如果输入文件只有1个分区,Spark根本不会分配到多个Worker

3. 核对spark-env.sh的关键配置

你给出的配置里有HADOOP_CONF_DIR,还要确认这些参数在所有节点(Master+Slave)的spark-env.sh里都正确:

  • Worker节点的可用核数:export SPARK_WORKER_CORES=2(别超过节点物理核数)
  • Worker节点的总可用内存:export SPARK_WORKER_MEMORY=1024m(和节点内存匹配)
  • Executor的内存上限:export SPARK_EXECUTOR_MEMORY=512m(避免单个executor占满节点内存,导致无法启动多个executor)

4. 检查输入数据的分区情况

如果你的WordCount用了HDFS上的文件,要注意:

  • HDFS默认块大小是128M,如果你的输入文件小于128M,只会生成1个块,对应Spark的1个分区——自然只会用单个Worker处理。解决方法是:要么把文件拆分成多个小文件,要么读取时用minPartitions强制增加分区数。

5. 排查调度资源占用情况

打开Master UI的Applications页面,看看当前任务的资源分配:

  • 有没有其他长时间运行的任务占满了集群资源?如果是FIFO调度模式(默认),新任务只能等待资源释放,或者只能拿到剩余的单个Worker资源。这种情况可以考虑切换到FAIR调度模式,或者调整任务的优先级。

先从第一步检查Worker注册状态开始,这是最常见的根源,然后一步步往下排查,应该能解决问题。

内容的提问来源于stack exchange,提问作者Yacine Mohammed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:33:32