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文件块大小)
247 0
|
存储
HDFS 文件块的大小为什么不能设置太小、也不能设置太大?
HDFS 文件块的大小为什么不能设置太小、也不能设置太大?
273 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
746 0
|
1月前
|
分布式计算 Kubernetes Hadoop
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
155 6
|
1月前
|
分布式计算 资源调度 Hadoop
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
65 2
|
20天前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第27天】在大数据时代,数据湖技术凭借其灵活性和成本效益成为企业存储和分析大规模异构数据的首选。Hadoop和Spark作为数据湖技术的核心组件,通过HDFS存储数据和Spark进行高效计算,实现了数据处理的优化。本文探讨了Hadoop与Spark的最佳实践,包括数据存储、处理、安全和可视化等方面,展示了它们在实际应用中的协同效应。
71 2
|
21天前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第26天】本文详细探讨了Hadoop与Spark在大数据处理中的协同作用,通过具体案例展示了两者的最佳实践。Hadoop的HDFS和MapReduce负责数据存储和预处理,确保高可靠性和容错性;Spark则凭借其高性能和丰富的API,进行深度分析和机器学习,实现高效的批处理和实时处理。
59 1
|
1月前
|
分布式计算 Hadoop 大数据
大数据体系知识学习(一):PySpark和Hadoop环境的搭建与测试
这篇文章是关于大数据体系知识学习的,主要介绍了Apache Spark的基本概念、特点、组件,以及如何安装配置Java、PySpark和Hadoop环境。文章还提供了详细的安装步骤和测试代码,帮助读者搭建和测试大数据环境。
59 1
|
1月前
|
存储 分布式计算 资源调度
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(一)
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(一)
76 5