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文件块大小)
222 0
|
存储
HDFS 文件块的大小为什么不能设置太小、也不能设置太大?
HDFS 文件块的大小为什么不能设置太小、也不能设置太大?
211 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
740 0
|
3月前
|
存储 分布式计算 Hadoop
Hadoop Distributed File System (HDFS): 概念、功能点及实战
【6月更文挑战第12天】Hadoop Distributed File System (HDFS) 是 Hadoop 生态系统中的核心组件之一。它设计用于在大规模集群环境中存储和管理海量数据,提供高吞吐量的数据访问和容错能力。
507 4
|
27天前
|
存储 分布式计算 Hadoop
【揭秘Hadoop背后的秘密!】HDFS读写流程大曝光:从理论到实践,带你深入了解Hadoop分布式文件系统!
【8月更文挑战第24天】Hadoop分布式文件系统(HDFS)是Hadoop生态系统的关键组件,专为大规模数据集提供高效率存储及访问。本文深入解析HDFS数据读写流程并附带示例代码。HDFS采用NameNode和DataNode架构,前者负责元数据管理,后者承担数据块存储任务。文章通过Java示例演示了如何利用Hadoop API实现数据的写入与读取,有助于理解HDFS的工作原理及其在大数据处理中的应用价值。
39 1
|
1月前
|
存储 缓存 分布式计算
|
1月前
|
存储 分布式计算 运维
Hadoop重新格式化HDFS的方案
【8月更文挑战第8天】
|
23天前
|
存储 分布式计算 资源调度
Hadoop生态系统概览:从HDFS到Spark
【8月更文第28天】Hadoop是一个开源软件框架,用于分布式存储和处理大规模数据集。它由多个组件构成,旨在提供高可靠性、高可扩展性和成本效益的数据处理解决方案。本文将介绍Hadoop的核心组件,包括HDFS、MapReduce、YARN,并探讨它们如何与现代大数据处理工具如Spark集成。
48 0

相关实验场景

更多