Spark Shell以YARN模式启动报错,请求排查容器失败原因
排查Spark Shell Yarn-Client启动失败的问题
Hey,我来帮你一步步拆解这个问题,先从你提到的SLF4J绑定冲突入手,再深挖Yarn应用挂掉的核心原因——毕竟日志看不到错误,大概率是日志输出被干扰了,或者我们没找对日志的地方。
1. 先搞定SLF4J绑定冲突(这是日志缺失的元凶)
你看到的SLF4J提示是说类路径里有两个SLF4J的实现,这会直接干扰日志输出,甚至导致应用启动时的错误日志根本打不出来。解决方法很直接:
- 定位冲突的jar包:除了Spark自带的
spark-assembly-1.6.1-hadoop2.6.0-cdh5.7.0.jar里的SLF4J绑定,另一个在jar:file:/...的路径里,你得把这个多余的SLF4J实现jar包移除。 - 实操方案:要么修改Spark的
spark-env.sh,在SPARK_CLASSPATH里排除这个冲突jar;要么直接把那个多余的jar移到备份目录(别直接删,留个后手)。 - 验证:重启Spark Shell,要是SLF4J的提示消失了,那日志就能正常输出了,接下来找错误就容易多了。
2. 深挖Yarn应用失败的核心原因(就算当前日志空,也有办法找线索)
如果搞定SLF4J后还是看不到日志,或者问题依旧,试试这些方法:
- 查看Yarn的ApplicationMaster日志:
这是最关键的一步!先通过yarn application -list找到你失败的应用ID(格式是application_xxxxxx_xxxx),然后用命令:
这里能看到ApplicationMaster启动的完整日志,大概率能找到启动失败的根因——比如内存不够、权限被拒、依赖找不到之类的。yarn logs -applicationId application_xxxxxx_xxxx - 调整内存配置,避免资源超限:
Spark Shell默认的内存配置可能超过了Yarn集群的容器限制,你可以启动时手动指定内存参数试试:
这里的spark-shell --master yarn-client --driver-memory 2g --executor-memory 2g --executor-cores 2--driver-memory是客户端(Driver)的内存,--executor-memory是每个Executor的内存,根据你的集群实际资源调整,别超过Yarn配置里的yarn.scheduler.maximum-allocation-mb上限。 - 检查权限问题:
你用root用户启动,有些Yarn集群会禁止root提交应用。要么切换到普通用户试试,要么修改Yarn的yarn.nodemanager.security.allowed-users配置,把root加进去。 - 确认版本兼容性:
你用的Spark 1.6.1搭配CDH 5.7.0是兼容的,但要确保Spark的Hadoop依赖和集群完全匹配——你用的spark-1.6.1-bin-2.6.0-cdh5.7.0是对的,但如果有其他第三方依赖版本不匹配,也会导致启动失败。 - 检查Yarn节点状态:
用yarn node -list看看所有NodeManager是不是都正常运行,如果某个节点挂了或者资源耗尽,ApplicationMaster可能没法启动。
3. 快速测试验证
先简化启动命令,用最基础的参数试试:
spark-shell --master yarn-client --driver-memory 1g --executor-memory 1g
如果能成功启动,说明之前的内存配置或者其他参数有问题,再逐步调整回去就行。
内容的提问来源于stack exchange,提问作者wanlinmua
相关产品推荐
相关产品推荐

