Spark Shell YARN模式启动失败求助:执行命令后陷入停滞
我之前在维护Spark 2.3 + Hadoop 2.7.3集群时,碰到过完全一样的问题——启动Spark Shell卡在YARN AM分配环节,RM UI一直显示ACCEPTED: waiting for AM container to be allocated, launched and register with RM。结合当时踩过的坑和排查经验,给你整理几个靠谱的解决方向:
1. 先确认YARN集群有没有可用资源
首先去Resource Manager UI的Nodes页面,看看所有NodeManager的状态:
- 有没有离线的Node?如果NM都挂了,肯定没法分配容器
- 剩余内存/CPU是不是被其他任务占满了?如果集群资源耗尽,YARN会一直排队等资源
要是资源不够,可以先提交一个资源需求极小的测试命令,看能不能启动:
./spark-shell --master yarn --deploy-mode client --executor-memory 512m --driver-memory 512m --num-executors 1
能启动的话,再逐步调大资源参数。
2. 核对yarn-site.xml的核心配置
这是最容易出问题的地方,重点检查以下几个参数:
yarn.nodemanager.resource.memory-mb:每个NM的总可用内存,必须大于你给Executor的内存(还要加上AM的内存,默认是1G左右)yarn.scheduler.maximum-allocation-mb:YARN允许单个容器申请的最大内存,要大于等于spark.executor.memory + spark.yarn.executor.memoryOverhead(默认Overhead是executor内存的10%)yarn.nodemanager.vmem-pmem-ratio:Hadoop 2.7默认是2.1,如果你的机器虚拟内存不足,NM会拒绝启动容器。可以临时调大到4,或者(仅限测试环境)关闭虚拟内存检查:yarn.nodemanager.vmem-check-enabled=falseyarn.resourcemanager.address/yarn.resourcemanager.scheduler.address:确保这两个参数指向正确的RM主机和端口,Spark客户端要能连通RM
3. 检查HDFS的权限和可用性
Spark AM启动时需要从HDFS读取依赖包,所以要确认:
- 你的用户对Spark安装目录下的
jars文件夹有读写权限,HDFS的对应目录(如果配置了spark.yarn.jars)也有足够空间和权限 - 执行
hdfs dfs -ls /测试HDFS是否能正常访问,连不上HDFS的话AM根本没法初始化
4. 去日志里找具体错误
别只看RM的状态提示,去翻日志才是解决问题的关键:
- RM日志:路径一般是
$HADOOP_HOME/logs/yarn-*-resourcemanager-*.log,里面会记录资源分配的详细过程 - NM日志:如果某个NM尝试启动AM但失败,
$HADOOP_HOME/logs/yarn-*-nodemanager-*.log里会有具体错误,比如内存不足、权限拒绝、依赖缺失 - Spark客户端日志:启动spark-shell的控制台输出里,往上翻会有调试信息,比如连接超时、资源申请被拒绝的原因
5. 补全mapred-site.xml配置
虽然你说不用MapReduce,但Spark on YARN还是依赖部分MapReduce配置。建议你复制mapred-site.xml.template为mapred-site.xml,至少加上:
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
这个参数是YARN模式下的必备项,缺失可能导致AM启动失败。
6. 排查网络与防火墙
- 确保RM、NM和Spark客户端之间的网络连通,比如RM的8032、8030端口,NM的8042端口都能正常访问
- 如果集群有防火墙,先临时关闭测试,排除端口被拦截的问题
内容的提问来源于stack exchange,提问作者user1870400
相关产品推荐
相关产品推荐

