Spark集群作业无法获取资源且Executor持续退出问题求助
看起来你已经把双节点Spark集群的基础搭建工作搞定了,Master和Worker能正常启动、Worker也成功注册,但运行代码时出了问题——结合你给出的环境信息(Spark 2.3.0、CentOS7、已关防火墙),我整理了几个常见的排查方向,你可以一步步验证:
1. 先确认资源配置的合理性
你设置了SPARK_WORKER_MEMORY=2g,但集群总内存是10G,这里可能存在资源分配不匹配的问题:
- 首先检查Worker的CPU核数配置:集群总共有4核,建议给Worker分配3核(留1核给系统和Master进程),可以在Worker的环境变量里添加:
export SPARK_WORKER_CORES=3 - 其次,提交任务时要明确指定executor的资源参数,比如用
spark-shell启动时:
如果请求的资源超过Worker能提供的上限,任务会直接报错。spark-shell --executor-memory 4g --total-executor-cores 2
2. 确保Python环境在集群节点间一致
你配置了PYSPARK_PYTHON=/opt/anaconda3/bin/python,这一步要注意Master和Worker节点的Python路径、版本必须完全一致:
- 登录Worker节点,执行以下命令验证:
如果Worker上没有这个Anaconda路径,或者Python版本和Master不匹配,PySpark任务会因为找不到正确的Python环境失败。解决办法要么在Worker上安装相同的Anaconda环境,要么把which python /opt/anaconda3/bin/python --versionPYSPARK_PYTHON改成两边都存在的Python路径(比如系统默认的/usr/bin/python,注意Spark2.3.0支持Python3.6及以下版本)。
3. 检查网络与Spark配置细节
虽然你设置了SPARK_MASTER_IP,但还有几个网络配置点要确认:
- Master和Worker节点要能互相ping通对方的IP和主机名,确保主机名解析正常(可以修改
/etc/hosts添加双方的IP和主机名映射) - 在
$SPARK_HOME/conf/spark-defaults.conf里添加spark.driver.host配置,指定Master节点的IP,避免Worker无法连接Driver进程:spark.driver.host=你的Master节点IP - 最关键的一步:查看Spark日志!Worker节点的日志在
$SPARK_HOME/logs目录下的worker-*.out/worker-*.log,Master的日志看master-*.log,日志里会明确给出报错的具体原因(比如资源不足、网络连接失败、依赖缺失等)。
4. 验证Java环境的一致性
你设置了JAVA_HOME=/usr/java/jdk1.8.0_144,同样要保证Worker节点的JAVA_HOME和Master完全一致,且JDK版本是Spark2.3.0支持的(必须是JDK1.8,不能用1.9及以上版本)。在Worker上执行:
echo $JAVA_HOME $JAVA_HOME/bin/java -version
确认输出和Master节点一致。
5. 排查任务代码本身的问题
如果是运行非常简单的代码(比如sc.parallelize(range(100)).count())报错,那大概率是环境配置问题;如果是自定义代码,要检查Worker节点是否安装了代码依赖的Python库,或者有没有把依赖包上传到集群中。
内容的提问来源于stack exchange,提问作者connie




