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
AI 代码解读

校验示例代码

/**
 * 文件块校验
 * @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;
}
AI 代码解读

测试示例代码:

// 元数据及其校验的数据块
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);
AI 代码解读
目录
打赏
0
0
0
0
52
分享
相关文章
分布式文件系统(HDFS产生背景及定义 HDFS优缺点 HDFS体系架构 HDFS文件块大小)
分布式文件系统(HDFS产生背景及定义 HDFS优缺点 HDFS体系架构 HDFS文件块大小)
275 0
HDFS 文件块的大小为什么不能设置太小、也不能设置太大?
HDFS 文件块的大小为什么不能设置太小、也不能设置太大?
369 0
Hadoop-2.4.0中HDFS文件块大小默认为128M
134217728 / 1024 = 131072 / 1024 = 128
759 0
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
252 6
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
116 2
Flume+Hadoop:打造你的大数据处理流水线
本文介绍了如何使用Apache Flume采集日志数据并上传至Hadoop分布式文件系统(HDFS)。Flume是一个高可用、可靠的分布式系统,适用于大规模日志数据的采集和传输。文章详细描述了Flume的安装、配置及启动过程,并通过具体示例展示了如何将本地日志数据实时传输到HDFS中。同时,还提供了验证步骤,确保数据成功上传。最后,补充说明了使用文件模式作为channel以避免数据丢失的方法。
97 4
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第27天】在大数据时代,数据湖技术凭借其灵活性和成本效益成为企业存储和分析大规模异构数据的首选。Hadoop和Spark作为数据湖技术的核心组件,通过HDFS存储数据和Spark进行高效计算,实现了数据处理的优化。本文探讨了Hadoop与Spark的最佳实践,包括数据存储、处理、安全和可视化等方面,展示了它们在实际应用中的协同效应。
212 2
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第26天】本文详细探讨了Hadoop与Spark在大数据处理中的协同作用,通过具体案例展示了两者的最佳实践。Hadoop的HDFS和MapReduce负责数据存储和预处理,确保高可靠性和容错性;Spark则凭借其高性能和丰富的API,进行深度分析和机器学习,实现高效的批处理和实时处理。
213 1
大数据体系知识学习(一):PySpark和Hadoop环境的搭建与测试
这篇文章是关于大数据体系知识学习的,主要介绍了Apache Spark的基本概念、特点、组件,以及如何安装配置Java、PySpark和Hadoop环境。文章还提供了详细的安装步骤和测试代码,帮助读者搭建和测试大数据环境。
135 1

相关实验场景

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等