Hadoop-HDFS文件块的校验

简介: 集群启动过程中,DataNode会校验自己的文件,并上报校验结果到NameNode。校验一般使用CRC即循环冗余校验码。

HDFS磁盘文件

HDFS数据文件落地磁盘后,会有如下的文件列表;一个数据块,一个是数据的校验文件。
相同文件的同一个block,在不同节点的副本中;block名字和校验文件都相同,可以相互校验。
集群启动过程中,DataNode会校验自己的文件,并上报校验结果到NameNode。

blk_1074062502
blk_1074062502_321678.meta
blk_1074062503
blk_1074062503_321679.meta
blk_1074062504
blk_1074062504_321680.meta

校验示例代码

/**
 * 文件块校验
 * @param metaPath 校验文件路径
 * @param blkPath Block数据文件
 * @return 校验通过true,否则false。
 * @throws IOException 
 */
public static boolean hdfsBlockCheck(String metaPath, String blkPath)
        throws IOException {
    // 元数据解析
    DataInputStream input= new DataInputStream(new FileInputStream(metaPath));
    BlockMetadataHeader readHeader = BlockMetadataHeader.readHeader(input);
    // 元数据版本号
    // short version = readHeader.getVersion();
    DataChecksum checksum = readHeader.getChecksum();
    // 512 每多少数据做一次校验
    int bytesPerChecksum = checksum.getBytesPerChecksum();
    // CRC32C : CRC即循环冗余校验码
    Type checksumType = checksum.getChecksumType();
    // 校验过程
    DataChecksum dataChecksum = DataChecksum.newDataChecksum(checksumType, bytesPerChecksum);
    
    // 读取数据块,启动校验过程
    byte[] dataBytes = new byte[bytesPerChecksum];
    byte[] checkBytes = new byte[dataChecksum.getChecksumSize()];
    DataInputStream dataIn = new DataInputStream(new FileInputStream(blkPath));
    // 文件长度
    long length = new File(blkPath).length();
    boolean result = true;
    while(dataIn.read(dataBytes) > 0) {
        // 记录剩余文件长度
        length = length - bytesPerChecksum;
        input.read(checkBytes);
        dataChecksum.reset();
        // 如果length小于0,那么最后一部分数据校验长度,不满bytesPerChecksum
        if(length >= 0) {
            dataChecksum.update(dataBytes, 0, dataBytes.length);
        } else {
            dataChecksum.update(dataBytes, 0, (int)(length + bytesPerChecksum));
        }
        // 校验失败,直接返回
        if(!dataChecksum.compare(checkBytes, 0)) {
            result = false;
            break;
        }
    }
    // 关闭数据流
    input.close();
    dataIn.close();
    return result;
}

测试示例代码:

// 元数据及其校验的数据块
String blk_meta = "C:\\Users\\TMS1000\\Downloads\\blk_1074062502_321678.meta";
String blk_path = "C:\\Users\\TMS1000\\Downloads\\38\\blk_1074062502";

// 元数据解析
boolean hdfsBlockCheck = hdfsBlockCheck(blk_meta, blk_path);
System.err.println(hdfsBlockCheck);
相关文章
|
存储 分布式计算 安全
分布式文件系统(HDFS产生背景及定义 HDFS优缺点 HDFS体系架构 HDFS文件块大小)
分布式文件系统(HDFS产生背景及定义 HDFS优缺点 HDFS体系架构 HDFS文件块大小)
243 0
|
存储
HDFS 文件块的大小为什么不能设置太小、也不能设置太大?
HDFS 文件块的大小为什么不能设置太小、也不能设置太大?
258 0
|
存储 机器学习/深度学习 分布式计算
Hadoop(HDFS)概述、HDFS产生背景、HDFS定义、HDFS优缺点、HDFS组成架构、HDFS文件块大小(面试重点)
Hadoop(HDFS)概述、HDFS产生背景、HDFS定义、HDFS优缺点、HDFS组成架构、HDFS文件块大小(面试重点)
Hadoop(HDFS)概述、HDFS产生背景、HDFS定义、HDFS优缺点、HDFS组成架构、HDFS文件块大小(面试重点)
Hadoop-2.4.0中HDFS文件块大小默认为128M
134217728 / 1024 = 131072 / 1024 = 128
745 0
|
29天前
|
分布式计算 Kubernetes Hadoop
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
127 6
|
1月前
|
SQL 分布式计算 监控
Hadoop-20 Flume 采集数据双写至本地+HDFS中 监控目录变化 3个Agent MemoryChannel Source对比
Hadoop-20 Flume 采集数据双写至本地+HDFS中 监控目录变化 3个Agent MemoryChannel Source对比
58 3
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
31 4
|
1月前
|
存储 分布式计算 资源调度
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(一)
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(一)
71 5
|
1月前
|
资源调度 数据可视化 大数据
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(二)
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(二)
34 4
|
1月前
|
XML 分布式计算 资源调度
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(一)
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(一)
131 5