2.1.3 Hadoop HDFS的数据完整性

HDFS会对写入的所有数据计算校验和,并在读取数据时验证校验和。他针对每个由io.bytes.per.checksum指定字节的数据计算校验和。默认情况下为512个字节,由于CRC-32校验和是4个字节,所以存储校验和的额外开销低于1%
 
存在以下几个数据完整性校验场景:
       1、datanode负责在收到数据后存储该数据,并且验证其校验和。他在收到客户端的数据或复制其它datanode数据时执行这个操作。正在写数据的客户端将数据及其校验和发送到由一系列DataNode组成的管线,管线中最后一个datanode负责验证校验和。如果DataNode检测到错误,客户端变回收到一个ChecksumException异常,它是IOException异常的一个子类,后者应该以应用程序特定的方式来处理,譬如重试这个操作。
 
      2、 客户端从datanode读取数据时,也会验证校验和,将他们与datanode中存储的校验和进行比较。每个datanode均持久保存有一个用于验证的校验和日志,所以它指导每个数据块的最后一次验证时间。客户端成功验证一个数据块后,会告诉这个datanode,datanode由此更新日志。保存这些统计信息对于检测损坏的磁盘很有价值。
       如果检测到错误处理步骤:
        1)、客户端向namenode报告已损坏的数据块,以及正在操作的这个DataNode
        2)、客户端抛出ChecksumException异常
        3)、namenode将这个数据块副本标记为已损坏,来防止后面再次将请求发送到这个节点
        4)、namenode安排这个块的副本复制到另一个datanode上,并将损坏的的数据块从所在的datanode节点上删除。
 
       3、每个datanode在后台会运行一个DataBlockScanner线程,定期验证存储在这个datanode上的所有数据块。
 
在使用open()方法读取文件之前,将FALSE值传递给FileSystem对象的setVerifyChecksum()方法,即可以禁用校验和验证。同样使用带-get选项的-ignoreCrc 命令或者使用-copyToLocal命令。
 
posted @ 2017-05-12 16:23  royis  阅读(649)  评论(0)    收藏  举报