Hadoop I/O操作 数据完整性保持

数据完整性

检测数据完整性的常见方法:在数据第一次引入系统时计算校验和(checksum),并在每一次通道传输时再次计算,比较两次校验和是否匹配,这只能检测数据是否有损坏,而不能修复数据

常见的错误检测码是CRC-32(32位循环冗余校验),任何大小的数据都计算获取32位大小的校验和

Hadoop ChecksumFileSystem使用CRC-32, Hadoop HDFS使用更有效的变体CRC-32C

HDFS数据完整性

1) dfs.bytes-pr-checksum指定每多少字节的数据计算一次校验和,默认512bytes,而CRC-32只占4bytes,存储开销不到1%

2) 写入

    datanode收到客户端数据或者其他datanode的副本数据时会进行校验,如果检测到错误,客户端就会收到一个IOException异常的子类,客户端可以重试写入操作来处理这个异常

    正在写的客户端把数据和校验和发送到datanode组成的管线,管线中的最后一个datanode负责验证校验和,即如果前面的datanode都正常,则由最后一个datanode发送确认到客户端

3) 读取

    客户端从datanode读取数据时计算校验和,与datanode中存储的校验和比较

    每个datanode都保存了一份校验和验证的持久化日志,记录数据块的最近验证时间,客户端验证成功后告诉datanode更新该日志,这份日志对于检测损坏很有帮助

4) datanode自身

    datanode有一个后台进程DataBlockScanner,定期验证存储在datanode上的所有数据块,解决物理存储媒体上损坏的问题

5) 数据修复

    客户端检测到错误,抛出ChecksumException -> 告诉namenode哪个datanode的哪个数据块损坏 -> namenode标记副本为已损坏或者把坏的副本拷贝到其他datanode -> 找一个新的datanode复制正确的数据块,保持副本数不变 -> 删除损坏的数据块

6) 禁用校验和:在调用open()之前调用setVerifyChecksum(false)

   命令行禁用: -ignoreCrc -get    =   -copyToLocal 

   检查文件校验和: hadoop fs -checksum 

LocalFileSystem

1) 执行客户端的校验和验证,在文件块校验和的目录下建立隐藏文件filename.crc

2) 计算开销低,只能增加少许读写操作,这对于保证数据完整性可接受

3) 禁用校验和验证,使用RawLocalFileSystem代替LocalFileSystem,因为RawLocalFileSystem本身就支持校验和验证

4) 设置全局校验和验证,需要将fs.file.impl属性设置为RawLocalFileSystem实现文件URI映射;也可以新建RawLocalFileSystem实例操作校验和验证

FileSystem fs = new RawLocalFileSystem()

ChecksumFileSystem

LocalFileSystem使用ChecksumFileSystem,使用ChecksumFileSystem向文件系统添加校验和很简单,这个类本身继承自FileSystem

FileSystem csFileSystem = new ChecksumFileSystem(rawFS);

底层文件系统“raw file system”,与上述的RawLocalFileSystem不是一回事

获取底层文件系统 getRawFileSystem()

获取任意文件的校验和文件路径 getChecksumFile()

报告校验和失败 reportChecksumFailure()

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值