Windows客户端远程向YARN集群提交Spark作业故障求助
解决Windows本地Spark客户端提交作业到远程YARN集群卡住的问题
看起来你遇到的是Windows客户端向远程YARN集群提交Spark作业时的连接/执行阻塞问题,结合你的配置情况,我从几个常见的排查方向给你具体的解决建议:
1. 先确认网络连通性与主机名解析
这是最常见的问题根源,Windows机器和YARN集群之间必须能双向通信:
- 检查端口开放情况:确保Windows防火墙没有阻止Spark客户端访问YARN集群的关键端口:
- ResourceManager的地址(
yarn-site.xml中yarn.resourcemanager.address对应的端口,默认8032) - ResourceManager的Web端口(默认8088)
- NodeManager的相关端口(
yarn.nodemanager.address等,默认8040) - HDFS NameNode的端口(
core-site.xml中fs.defaultFS对应的端口,默认9000)
可以用Windows的telnet命令测试,比如telnet <RM_HOST> 8032,如果连接失败,需要在集群侧开放对应端口,或者关闭Windows本地防火墙测试。
- ResourceManager的地址(
- 配置主机名映射:如果集群节点用的是内部主机名(而非公网IP),Windows本地需要在
C:\Windows\System32\drivers\etc\hosts文件中添加集群所有节点的主机名-IP映射,比如:
这样Windows才能正确解析集群节点的地址。192.168.1.100 yarn-master 192.168.1.101 yarn-slave1 192.168.1.102 yarn-slave2 ...
2. 修正Spark环境变量的配置方式
注意:Windows系统下,Spark的spark-env.sh是Linux/Unix环境的配置文件,Windows需要用spark-env.cmd(如果没有可以手动在Spark的conf目录创建):
- 在
spark-env.cmd中添加Hadoop配置目录的设置:
同时确保Windows系统的环境变量中也配置了set HADOOP_CONF_DIR=C:\path\to\your\hadoop-conf-dirHADOOP_HOME,指向你本地安装的适配集群版本的Hadoop客户端路径,并且把%HADOOP_HOME%\bin加入到系统PATH中。 - 必须安装Windows版本的Hadoop客户端:Spark依赖Hadoop的客户端库来和YARN/HDFS通信,你需要下载与集群Hadoop版本一致的Windows版Hadoop(注意要包含
winutils.exe和hadoop.dll),否则会出现各种连接或权限异常。
3. 检查Spark提交命令的参数
确保你的spark-submit命令参数正确,尤其是部署模式:
- 如果用
--deploy-mode client:Driver程序会在你的Windows本地运行,这时候YARN集群的NodeManager需要能回连到你的Windows机器的端口(Spark Driver默认随机端口),所以需要Windows防火墙允许集群的入站连接,或者切换到--deploy-mode cluster试试(Driver在集群的ApplicationMaster中运行,避免双向连接问题)。 - 完整的提交命令示例(参考):
spark-submit --master yarn --deploy-mode cluster --class com.your.package.YourMainClass --executor-memory 2g --num-executors 4 your-application.jar
4. 排查日志定位具体错误
如果以上步骤都没问题,一定要通过日志找具体异常:
- 本地Spark提交日志:查看提交命令输出的日志,找
ERROR或WARN级别的信息,比如是否有"Connection refused"、"Unknown host"这类明确的错误。 - YARN集群日志:登录YARN Master节点,查看ResourceManager的日志(默认路径
$HADOOP_HOME/logs/yarn-yarn-resourcemanager-*.log),或者在YARN WebUI(默认http://<RM_HOST>:8088)中找到对应的应用,查看ApplicationMaster的日志,里面会有更详细的执行失败原因。
5. 额外的小细节
- 确保本地的
core-site.xml和yarn-site.xml和集群上的完全一致,不要有路径或地址的差异。 - 如果集群开启了Kerberos认证,还需要在Windows客户端配置Kerberos的
krb5.conf,并获取票据,不过如果你的集群没开Kerberos可以忽略这一点。
按照这个顺序一步步排查,应该能定位到问题所在。
内容的提问来源于stack exchange,提问作者Khalil Mansour
相关产品推荐
相关产品推荐

