java - 使用java读取hdfs blk_.meta文件

标签 java hadoop hdfs

在Hadoop的数据节点中,始终存在包含数据原始字节的 block 文件,以及带有生成的戳记和扩展名为.meta的元数据文件。

我试图在 vi 中打开元数据,它看起来像是乱码内容。我假设它是某种序列化的二进制格式。我看了一下 HDFS 的源代码,感觉 org.apache.hadoop.hdfs.server.datanode.BlockMetadataHeader.readHeader 是最有可能读取元数据的方法。

我在本地下载了一个元文件并在 Eclipse 中编写了一些代码。

package com.bw;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.hadoop.hdfs.server.datanode.BlockMetadataHeader;
public class Test {
    public static void main(String[] args) {
        DataInputStream input = null;
        BlockMetadataHeader header = null;

        try {
            input = new DataInputStream(
                    new FileInputStream("C:/Users/bw/Desktop/blk_1116668343556322736_1551688.meta"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            BlockMetadataHeader.readHeader(input);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(header.getChecksum());
    }
} 

然而,语法是正确的,但它会出错并显示以下消息。

java.io.IOException: Could not create DataChecksum of type 2 with bytesPerChecksum 512
    at org.apache.hadoop.util.DataChecksum.newDataChecksum(DataChecksum.java:86)
    at org.apache.hadoop.hdfs.server.datanode.BlockMetadataHeader.readHeader(BlockMetadataHeader.java:100)
    at org.apache.hadoop.hdfs.server.datanode.BlockMetadataHeader.readHeader(BlockMetadataHeader.java:75)
    at com.bwang.Test.main(Test.java:27)
Exception in thread "main" java.lang.NullPointerException
    at com.bwang.Test.main(Test.java:32)

我搜索了错误,但几乎找不到任何有用的资源。谁能帮我如何读取 block 元数据文件的元数据?


更新,毕竟是meta文件版本和maven Hadoop版本不匹配。

# hadoop version
Hadoop 2.0.0-cdh4.6.0

然后我将 maven pom 文件更改为以下内容并且它起作用了

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>jdk.tools</groupId>
        <artifactId>jdk.tools</artifactId>
        <version>1.7.0_05</version>
        <scope>system</scope>
        <systemPath>C:\Program Files\Java\jdk1.7.0_55\lib\tools.jar</systemPath>
    </dependency>
</dependencies>

最佳答案

会不会是您正在使用 hadoop pre-0.23.0 库来对抗更高版本的元数据文件?

类型 2 是 3 年前作为 HADOOP-7443 的一部分引入 DataChecksum 的

http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/DataChecksum.java?r1=1146111&r2=1146300 .

关于java - 使用java读取hdfs blk_.meta文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23728670/

相关文章:

java - 如何将java类(从一个包)继承到另一个类(在另一个包中)

java - 如何在框架东边设置两个面板

java - hadoop类未找到异常,即使它在hadoop类路径中

hadoop - Hadoop 中的 Block、chunk 和 file split 有什么区别?

java - 在 Android 中使用 MapStruct 来映射泛型类型?

java - Hbase Java API连接错误

php - 错误:未能找到建议检查集群运行状况的数据节点

ubuntu - Hadoop Yarn 作业跟踪器未启动

java - 将普通的Java代码转换为hadoop代码而不使用mapreduce?

java - 如何将文件加载到 session bean 中