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端口)这些通信端口
- Slave节点的
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
相关产品推荐
相关产品推荐

