hadoop :java.io.FileNotFoundException: File does not exist:

本文详细解读了使用Hadoop Eclipse插件下MR程序时遇到的路径配置错误,包括本地运行和集群提交的区别,以及如何正确设置fs.default.name避免报错。同时,还分享了在将HDFS数据导入HBase时遇到的Reducer初始化问题,通过实例分析了错误原因及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击打开链接转自:http://blog.163.com/silver9886@126/blog/static/35971862201441134010403/

1.用hadoop的eclipse插件下M/R程序的时候,有时候会报
Exception in thread "main" java.lang.IllegalArgumentException: Pathname /D:/hadoop/hadoop-2.2.0/hadoop-2.2.0/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar from hdfs://uat84:49100/D:/hadoop/hadoop-2.2.0/hadoop-2.2.0/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar is not a valid DFS filename
服务器下报错是:
[ 2014-05-11 19:09:40,019] ERROR [main] (UserGroupInformation.java:1494) org.apache.hadoop.security.UserGroupInformation - PriviledgedActionException as:hadoop (auth:SIMPLE) cause:java.io.FileNotFoundException: File does not exist: hdfs://uat84:49100/usr/local/bigdata/hbase/lib/hadoop-common-2.2.0.jar
Exception in thread "main" java.io.FileNotFoundException: File does not exist: hdfs://uat84:49100/usr/local/bigdata/hbase/lib/hadoop-common-2.2.0.jar
        at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:1110)
        at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:1102)
        at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
        at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1102)
        at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.getFileStatus(ClientDistributedCacheManager.java:288)
        at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.getFileStatus(ClientDistributedCacheMa
这是tm的什么fucking错误!!拿着别人正确的程序一点一点查,发现是因为有这句话:
Configuration conf = new Configuration();
conf.set("fs.default.name", "hdfs://uat84:49100");
这是什么意思呢,就是说,你如果是本地跑,就是不引入mapred-site,yarn-site,core-site这些配置文件,那么这个地方也不要设置,因为你是在本地跑M/R程序,( fs.default.name默认值是file:///,表示本地文件系统)这个地方却又告诉hadoop,需要的jar包从hdfs中取,当然会报以上的问题。那么,在本地跑直接去掉这句话就ok了。
反之,如果你是提交到集群,引入了mapred-site,yarn-site,却没有引入core-site,也没有设置fs.default.name,那么,因为不知道namenode的地址,无法将job.jar提交到hadoop集群上,因此会报如下错误:
[ 2014-05-13 16:35:03,625] INFO [main] (Job.java:1358) org.apache.hadoop.mapreduce.Job - Job job_1397132528617_2814 failed with state FAILED due to: Application application_1397132528617_2814 failed 2 times due to AM Container for appattempt_1397132528617_2814_000002 exited with  exitCode: -1000 due to: File file:/tmp/hadoop-yarn/staging/hadoop/.staging/job_1397132528617_2814/job.jar does not exist
.Failing this attempt.. Failing the application.
牛不牛!因此我们只要告诉hadoop我们的namenode地址就可以了。引入core-site或是设置
fs.default.name 都是一样的

2.在跑hdfs到hbase的代码的时候,报出如下错误:
java.lang.RuntimeException: java.lang.NoSuchMethodException: CopyOfHive2Hbase$Redcuer.<init>()
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:131)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:629)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:405)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:445)
Caused by: java.lang.NoSuchMethodException: CopyOfHive2Hbase$Redcuer.<init>()
at java.lang.Class.getConstructor0(Class.java:2715)
at java.lang.Class.getDeclaredConstructor(Class.java:1987)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:125)
... 3 more
fucking man啊,光看这个,谁能看出来Rducer哪里写的有问题!我服他了!!!
也是对比人家正确的代码,一点一点看,发现,原来是因为我的reduce方法不是static的!!!! hadoop 简单程序下的错误和陷阱 - silver9886@126 - silver9886@126的博客想死的心都有了
public static class Redcuer extends TableReducer<Text, Text, NullWritable> {  
private String[] columname ;
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {  
System.out.println("!!!!!!!!!!!!!!!!!!!reduce!!!!!!!" + key.toString());
Put put = new Put(Bytes.toBytes("test1234"));
put.add(Bytes.toBytes("fc"), Bytes.toBytes("1"), Bytes.toBytes("2"));
    context.write(NullWritable.get(), put);
}
}
### Hadoop Java 文件未找到异常解决方案 当遇到 `java.io.FileNotFoundException` 并提示路径不是文件时,通常是因为指定的路径不正确或者权限不足。以下是针对该问题的具体分析和解决方法: #### 1. 配置环境变量 确保 Hadoop 的安装目录以及其子目录具有正确的访问权限,并确认 `JAVA_HOME` 已正确定义并指向实际的 JDK 安装位置[^2]。 如果当前使用的脚本为 Windows 环境下的 `.cmd` 或 Linux 下的 `.sh` 脚本,则需检查以下内容: - **Windows**: 修改 `hadoop-env.cmd` 中的 `set JAVA_HOME=D:\path\to\jdk`。 - **Linux/MacOS**: 编辑 `hadoop-env.sh` 文件,添加或修改如下行: ```bash export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 ``` #### 2. 检查输入路径的有效性 错误消息表明 `/user/hadoop/input` 不是一个有效的文件路径。这可能由以下几个原因引起: - 输入路径不存在; - 使用了错误的 URI 格式; 建议通过以下方式验证路径是否存在: ```bash hdfs dfs -test -e /user/hadoop/input ``` 如果没有返回任何输出,则表示路径存在。否则需要创建目标路径或将数据上传至对应位置: ```bash hdfs dfs -mkdir -p /user/hadoop/ hdfs dfs -put local_file_path /user/hadoop/input ``` #### 3. 正确调用 HDFS API 在 Java 程序中读取 HDFS 数据时,应使用 `FileSystem.get()` 方法获取分布式文件系统的实例[^3]。下面是一段示例代码展示如何连接到 HDFS 和处理文件操作: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.net.URI; public class HDFSTest { public static void main(String[] args) throws Exception { String hdfsUri = "hdfs://namenode:9000/user/hadoop/input"; Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(new URI(hdfsUri), conf); if (fs.exists(new Path("/user/hadoop/input"))) { System.out.println("File exists!"); } else { throw new RuntimeException("Input path does not exist."); } } } ``` #### 4. 同步集群配置文件 完成本地测试后,在多节点环境中部署应用前还需同步所有节点上的核心配置文件[^4]。可以利用命令如 `scp` 将更新后的 XML 文件复制到其他机器上: ```bash scp core-site.xml ssl-server.xml ssl-client.xml mapred-site.xml user@nodeX:/opt/hadoop/etc/hadoop/ ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值