Hadoop 读取文件API报错

在使用Hadoop集群进行文件读取时遇到BlockMissingException错误,并通过调整代码和环境配置成功解决。

Exception in thread "main" org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-1124468226-10.0.2.15-1429879726015:blk_1073742186_1370 file=/user/testdir/yarn-site.xml
    at org.apache.hadoop.hdfs.DFSInputStream.chooseDataNode(DFSInputStream.java:889)
    at org.apache.hadoop.hdfs.DFSInputStream.fetchBlockByteRange(DFSInputStream.java:998)
    at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:1333)
    at org.apache.hadoop.fs.FSInputStream.readFully(FSInputStream.java:78)
    at org.apache.hadoop.fs.FSDataInputStream.readFully(FSDataInputStream.java:116)
    at com.hdfs.file.ReadFile.main(ReadFile.java:24)、

代码如下,在windows机器上运行,报上面的错误:

package com.hdfs.file;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class ReadFile {

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Configuration conf=new Configuration();
        FileSystem fs=FileSystem.get(conf);
        Path path=new Path("hdfs://sandbox.hortonworks.com:8020/user/testdir/yarn-site.xml");
        if(fs.exists(path)){
            FSDataInputStream fsIn=fs.open(path);
            FileStatus status=fs.getFileStatus(path);
            byte[] buffer=new byte[Integer.parseInt(String.valueOf(status.getLen()))];
            fsIn.readFully(0,buffer);
            fsIn.close();
            fs.close();
            System.out.println("读取完成!");
            System.out.println(new String(buffer));
        }else{
            throw new Exception("the file is not found!");
        }
    }

}

 

将代码打成Jar包,放到hadoop集群上去运行,一切正常:

image

image

image

image

 

 

 

 

<think>好的,我现在需要解决用户在配置Hadoop HDFS时,在Idea中遇到的依赖配置报错问题。用户提到了引用[1]到[4],我需要结合这些引用来分析可能的原因和解决方案。 首先,用户提供的引用[1]提到将HADOOP_HOME添加到Path中,并引用了%HADOOP_HOME%\bin。这可能涉及到环境变量配置的问题。如果Hadoop的环境变量没有正确设置,Idea可能无法找到相关的依赖库,导致编译或运行时错误。需要确认用户是否正确配置了HADOOP_HOME,并且bin目录下有必要的可执行文件和库文件。 接下来,引用[2]是关于Maven依赖中的groupId org.apache.hadoop。用户可能在pom.xml中添加了Hadoop相关的依赖,但版本不兼容或依赖项缺失可能导致报错。需要检查依赖的版本是否与本地安装的Hadoop版本一致。例如,如果用户使用的是Hadoop 3.3.1,那么依赖的版本也应该对应为3.3.1,否则可能出现类找不到或方法不存在的错误。 引用[3]提到了HFile数量超过默认值的问题,但这个问题似乎与MapReduce的配置有关,特别是HBase的批量加载。虽然用户当前的问题是关于HDFS的依赖配置,但这里可能涉及到MapReduce任务的相关设置。如果用户在代码中使用了HBase的API,可能需要调整hbase-site.xml中的配置参数。不过这可能不是当前问题的核心,但需要留意是否有相关配置错误。 引用[4]指出hdfs-site.xml中的heartbeat.recheck.interval和dfs.heartbeat.interval的单位不同,需要正确配置。如果用户修改了这些参数,但单位设置错误,可能导致HDFS服务无法正常启动或通信,间接导致Idea中的依赖报错。例如,节点间的心跳检测失败可能导致连接超时,但这类错误通常出现在运行时而非编译时,所以可能不是当前问题的直接原因,但需要确认配置文件的正确性。 综合来看,用户的问题可能集中在环境变量配置和Maven依赖管理两个方面。首先,检查HADOOP_HOME是否正确设置,并且Path中包含%HADOOP_HOME%\bin。其次,确保pom.xml中的Hadoop依赖版本与实际安装版本一致,同时包含所有必要的模块,如hadoop-common、hadoop-hdfs、hadoop-client等。此外,用户可能在Idea中运行代码时,缺少本地库的支持,例如winutils.exe在Windows环境下是必需的,缺少这个文件会导致HDFS操作失败。因此,建议用户下载对应版本的winutils并放入Hadoop的bin目录下。 另外,用户提到的引用[1]中的toString报错可能涉及到MapReduce作业中对象的序列化问题。检查是否在自定义的Writable类中正确实现了toString方法,或者是否在代码中错误地调用了某个未正确重写toString的方法,导致运行时异常。需要确保所有自定义的数据类型都正确实现了序列化和反序列化方法。 最后,用户可能需要清理Maven项目并重新导入依赖,或者检查Idea的缓存和重启情况,有时候依赖下载不完整或缓存问题也会导致编译错误。同时,确认Hadoop的配置文件(如core-site.xml、hdfs-site.xml)是否正确放置在项目的资源目录下,以便应用程序能够读取到正确的HDFS配置信息。</think>### Hadoop HDFS Idea依赖配置报错解决方案 #### 1. 环境变量验证 - **确认`HADOOP_HOME`配置** 确保系统环境变量中已正确设置`HADOOP_HOME`,指向Hadoop安装目录(如`C:\hadoop-3.3.1`),并将`%HADOOP_HOME%\bin`添加到Path中[^1]。 **操作步骤**: - 右键“此电脑” → 属性 → 高级系统设置 → 环境变量 → 新建系统变量`HADOOP_HOME` - 编辑Path变量,添加`%HADOOP_HOME%\bin` - **Windows依赖补充** 在Windows环境下,需下载`winutils.exe`和`hadoop.dll`,放置到`%HADOOP_HOME%\bin`目录中,否则会触发文件系统权限错误。 --- #### 2. Maven依赖配置 - **检查依赖版本一致性** 确保`pom.xml`中的Hadoop依赖版本与实际安装版本严格匹配。例如Hadoop 3.3.1的配置应为: ```xml <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>3.3.1</version> </dependency> ``` 若版本不匹配会导致`ClassNotFoundException`或`NoSuchMethodError`[^2]。 - **添加必要依赖模块** 若涉及MapReduce或HBase操作,需补充以下依赖: ```xml <!-- HBase客户端(按需添加) --> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.4.9</version> </dependency> ``` --- #### 3. 配置文件加载问题 - **核心配置文件位置** 将`core-site.xml`、`hdfs-site.xml`等配置文件复制到项目的`src/main/resources`目录,确保运行时能正确读取HDFS地址、端口等关键参数。 **示例配置片段**: ```xml <!-- core-site.xml --> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> ``` - **参数单位修正** 检查`hdfs-site.xml`中`heartbeat.recheck.interval`(毫秒)和`dfs.heartbeat.interval`(秒)的单位设置,错误单位会导致节点通信失败[^4]。 --- #### 4. Idea工程设置 - **重新加载Maven依赖** 在Idea中执行以下操作: - 右键项目 → Maven → Reimport - 菜单栏 → File → Invalidate Caches / Restart → 清理缓存并重启 - **本地库路径绑定(仅限Windows)** 在Run/Debug Configurations中添加VM参数: ``` -Djava.library.path=%HADOOP_HOME%/bin ``` --- #### 5. 代码层检查 - **序列化与反序列化** 若报错涉及`toString()`调用,检查自定义Writable类是否实现`toString()`方法。例如: ```java public class CustomWritable implements Writable { private String value; @Override public void write(DataOutput out) throws IOException { out.writeUTF(value); } @Override public void readFields(DataInput in) throws IOException { value = in.readUTF(); } @Override public String toString() { // 必须重写 return value; } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值