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
|
1月前
|
存储 分布式计算 Hadoop
|
19天前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
70 0
|
25天前
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
|
26天前
|
存储 SQL 分布式计算
Hadoop生态系统概述:构建大数据处理与分析的基石
【8月更文挑战第25天】Hadoop生态系统为大数据处理和分析提供了强大的基础设施和工具集。通过不断扩展和优化其组件和功能,Hadoop将继续在大数据时代发挥重要作用。
|
27天前
|
资源调度 分布式计算 Hadoop
揭秘Hadoop Yarn背后的秘密!它是如何化身‘资源大师’,让大数据处理秒变高效大戏的?
【8月更文挑战第24天】在大数据领域,Hadoop Yarn(另一种资源协调者)作为Hadoop生态的核心组件,扮演着关键角色。Yarn通过其ResourceManager、NodeManager、ApplicationMaster及Container等组件,实现了集群资源的有效管理和作业调度。当MapReduce任务提交时,Yarn不仅高效分配所需资源,还能确保任务按序执行。无论是处理Map阶段还是Reduce阶段的数据,Yarn都能优化资源配置,保障任务流畅运行。此外,Yarn还在Spark等框架中展现出灵活性,支持不同模式下的作业执行。未来,Yarn将持续助力大数据技术的发展与创新。
27 2
|
1月前
|
分布式计算 Hadoop 大数据
Spark 与 Hadoop 的大数据之战:一场惊心动魄的技术较量,决定数据处理的霸权归属!
【8月更文挑战第7天】无论是 Spark 的高效内存计算,还是 Hadoop 的大规模数据存储和处理能力,它们都为大数据的发展做出了重要贡献。
62 2

热门文章

最新文章

相关实验场景

更多