Hadoop 2中HDFS路径异常:FileNotFoundException问题排查
Hadoop 2迁移后FileNotFoundException的原因分析
我来帮你拆解下这个问题——你的代码在Hadoop 1里运行正常,迁移到Hadoop 2就抛出文件不存在的异常,核心原因主要集中在以下几点:
1. URI字符串中的空格是致命坑点
先看你代码里这行关键代码:
URI localHDFSManifestUri = new URI(" hdfs:///WordCount/write");
注意到hdfs:///开头的空格了吗?Hadoop 1对URI的解析逻辑比较宽松,会自动忽略这种开头的无效空格;但Hadoop 2严格遵循URI规范,会把这个空格当成路径的一部分解析,相当于你实际访问的路径是 hdfs:///WordCount/write(带空格前缀),而HDFS上根本不存在这个带空格的路径,自然就触发FileNotFoundException了。
2. Hadoop 2对FileSystem API的解析逻辑更严格
Hadoop 2对FileSystem的初始化和路径校验做了不少优化和严格化调整:
- 相比Hadoop 1,
FileSystem.get(URI, Configuration)方法会严格校验URI的合法性,不会自动修正格式不规范的URI - 如果你的
conf配置中已经设置了默认HDFS地址(比如fs.defaultFS),手动传入格式错误的URI可能会和默认配置冲突,进一步导致路径解析错误
3. 额外排查补充
虽然你提到Hadoop 1能正常运行,但还是可以快速确认两个点:
- 确认HDFS上
/WordCount/write路径确实存在,且当前运行代码的用户有访问权限(Hadoop 2的权限控制比Hadoop 1更严格) - 检查代码中
hdfs:///WordCount/write的路径写法是否和集群FS配置匹配,如果集群HDFS地址是带主机名的hdfs://namenode:port/,直接写hdfs:///也会导致路径找不到
快速修复建议
先把URI字符串里的空格去掉,改成:
URI localHDFSManifestUri = new URI("hdfs:///WordCount/write");
重新运行代码,大概率就能解决这个问题了。
内容的提问来源于stack exchange,提问作者Rohit Mishra
相关产品推荐
相关产品推荐

