远程Spark集群环境下spark-submit提交HDFS中Jar包失败报错排查
解决Spark-Submit Cluster模式下HDFS URI不完整的错误
你遇到的问题核心在于Cluster模式下Spark Driver和Executor读取的是集群节点的配置,而非本地笔记本的配置,再加上URI写法的小失误,才导致了这个报错。下面一步步帮你排查解决:
1. 修正HDFS URI的写法
你提到尝试用完整路径时写了hdfs:///mydns.asuscomm.com:8021/user/...,这里多了一个斜杠!正确的完整HDFS URI格式是hdfs://<host>:<port>/path——两个斜杠后直接跟主机和端口,再跟路径。你写的三个斜杠会让系统把mydns.asuscomm.com:8021当成路径的一部分,自然会报错"Incomplete HDFS URI, no host"。
正确的完整路径应该是:
hdfs://mydns.asuscomm.com:8021/user/stevenhurwitt/jars/redditStreaming-1.0-SNAPSHOT.jar
2. 确保集群节点的Hadoop/Spark配置同步
Cluster模式下,Driver是在集群的某个节点上启动的,Executor也运行在集群节点上,它们读取的是集群本地的配置文件,不是你笔记本上的core-site.xml。所以需要:
- 登录到集群的所有节点,检查
$HADOOP_HOME/libexec/etc/hadoop/core-site.xml,确保里面的fs.defaultFS配置和你本地一致:<property> <name>fs.defaultFS</name> <value>hdfs://mydns.asuscomm.com:8021</value> </property> - 如果Spark使用独立的配置文件(比如
$SPARK_HOME/libexec/conf/core-site.xml),也要同步这个配置到所有集群节点,然后重启Spark集群服务让配置生效。
3. 验证集群节点的HDFS访问能力
登录到集群的任意节点,执行以下命令确认节点能正常访问目标HDFS路径:
hdfs dfs -ls hdfs://mydns.asuscomm.com:8021/user/stevenhurwitt/jars/
如果这里失败,说明集群节点存在网络或解析问题:
- 可以尝试换成NameNode的IP地址替代DNS域名;
- 检查集群节点和NameNode之间的网络连通性,确保8021端口开放。
4. 显式指定Spark配置参数(兜底方案)
如果不想修改集群配置,或者配置同步有问题,可以在spark-submit命令中直接指定spark.hadoop.fs.defaultFS参数,强制Driver和Executor使用正确的默认FS:
spark-submit --deploy-mode cluster \ --conf spark.hadoop.fs.defaultFS=hdfs://mydns.asuscomm.com:8021 \ --class com.steven.redditStreaming.dataFrameFromCSVFile \ hdfs://mydns.asuscomm.com:8021/user/stevenhurwitt/jars/redditStreaming-1.0-SNAPSHOT.jar
按照上面的步骤操作,应该就能解决这个URI错误了。
内容的提问来源于stack exchange,提问作者steven hurwitt




