使用java读取hdfs blk_u2;.meta文件

使用java读取hdfs blk_u2;.meta文件,java,hadoop,hdfs,Java,Hadoop,Hdfs,在Hadoop的数据节点中,始终存在包含数据原始字节的块文件,以及具有生成的戳记和扩展名.meta的元数据文件 我试着用vi打开元数据,它看起来像是乱七八糟的内容。我假设它是某种序列化的二进制格式。我看了一下HDFS的源代码,觉得org.apache.hadoop.HDFS.server.datanode.BlockMetadataHeader.readHeader是最有可能读取元数据的方法 我在本地下载了一个元文件,并在Eclipse中编写了一些代码 package com.bw; impor

在Hadoop的数据节点中,始终存在包含数据原始字节的块文件,以及具有生成的戳记和扩展名
.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)
我搜索错误,几乎找不到任何有用的资源。谁能帮我读取块元数据文件的元数据吗


毕竟,更新是元文件版本和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>

org.apache.hadoop
hadoop hdfs
2.4.0
org.apache.hadoop
hadoop通用
2.4.0
jdk.tools
jdk.tools
1.7.0_05
系统
C:\ProgramFiles\Java\jdk1.7.0\U 55\lib\tools.jar

可能是您在对更高版本的元数据文件使用hadoop 0.23.0之前的库吗

类型2是3年前作为数据校验和的一部分引入的


.

先生,非常感谢您的回答。我现在可以读入头文件了。。我注意到元文件的大小约为1MB,但似乎只有很少几种方法可以使用
校验和
版本
、和
头版本化
。这些1MB中还有其他信息吗?