Spark访问HDFS文件路径格式疑问:YARN提交Jar报错求助
我来帮你理清这个问题——其实你遇到的差异是因为Spark Shell本地模式和YARN集群模式下,HDFS路径的解析逻辑不一样:
为什么Spark Shell里hdfs:///datastore/events.txt能正常工作?
当你在本地运行Spark Shell时,它会自动读取你本地Hadoop配置目录(一般是$HADOOP_CONF_DIR)里的core-site.xml文件,其中的fs.defaultFS配置项会帮你补全hdfs:///里缺失的namenode地址(也就是authority部分),相当于自动把路径转换成了hdfs://<你的namenode主机名>:<端口>/datastore/events.txt,所以能正常读取。
为什么YARN提交Jar时会报错?
而提交到YARN集群时,要么是你的应用没有正确加载到集群的Hadoop配置,要么是YARN容器里的默认文件系统配置和本地不一致,导致Hadoop无法解析hdfs:///这种省略了namenode地址的路径,从而抛出Uri without authority的错误。
几种靠谱的解决方案
推荐:使用相对路径
直接去掉协议前缀,写成sc.textFile("/datastore/events.txt")。这样Hadoop会自动从当前环境的fs.defaultFS配置中获取默认文件系统,不管是本地Shell还是YARN集群模式都能适配,完全不用硬编码路径前缀。明确指定完整的namenode地址
如果必须指定HDFS协议,可以把路径写成完整的格式:sc.textFile("hdfs://<namenode主机名>:<端口>/datastore/events.txt")(比如hdfs://namenode:9000/datastore/events.txt)。这种写法不依赖默认配置,在任何环境下都能直接定位到正确的namenode,适合需要跨文件系统操作的场景。确保YARN任务加载到正确的Hadoop配置
提交Jar时,可以通过--conf参数指定Hadoop配置路径,比如:spark-submit --class your.main.Class --master yarn --deploy-mode cluster --conf spark.hadoop.fs.defaultFS=hdfs://namenode:9000 your-app.jar这样能强制YARN容器使用指定的默认文件系统配置,避免路径解析错误。
内容的提问来源于stack exchange,提问作者Girish Bhat M

