11.3 数据完整性

任何用户都希望系统在存储和处理数据时不会丢失或损坏任何数据.

尽管磁盘或网络会保证每个I/O操作不太可能引起错误, 但是如果要处理的数据量达到Hadoop的处理极限时, 数据被损坏的概率还是很高的.


DataNode写数据的完整校验过程:

  1. 正在写数据的客户端把数据和数据的校验和(checksum)发给DataNode组成的管线.

  2. DataNode在收到数据与校验和 之后, 存储数据与校验和 之前对数据进行验证.

  3. 由管线中的最后一个DataNode负责验证. 如果验证通过, 则会进行存储. 如果验证错误, 客户端就会收到一个IOException异常的子类异常对象.

  4. 对于收到的异常, 应用程序应该有自己的处理方式, 比如重试这个写的操作.


DataNode读数据的完整校验过程

  1. 客户端读取数据, DataNode会把数据与校验和都发给客户端

  2. 客户端收到数据后会会重新计算一个校验和, 然后与DataNode传递过来的校验和进行对比.

  3. 每个DataNode均持久保存有一个用于验证的校验和日志(persistent log of checksum verification), 客户端成功验证一个数据后, 会告诉DataNode, DataNode就会更新这个日志. 所以, 他知道每个数据块的最会一次验证时间.


不只是客户端在读取数据块的时候会验证校验和, 每个DataNode也会在一个后台运行一个DataBlockScanner, 从而定期验证存储在这个DataNode上的所有数据块.


数据块的修复

由于HDFS存储着每个数据块的复本, 因此它可以通过数据复本来修复损坏的数据库, 进而得到一个新的, 完好无损的复本.

基本思路:

  1. 客户端读取数据块时, 如果检测到错误, 首先向NameNode报告已损坏的数据块及其正在尝试读操作的这个数据块, 再抛出CheckSumException

  2. NameNode将这个数据块复本标记为已损坏, 这样它不再将客户端处理请求直接发送到这个节点.

  3. NameNode会安排这个数据块的一个复本复制到另外一个DataNode上, 这样数据块的复本数量又回到了期望水平.

  4. 损坏的数据块得到的修复.


禁用校验和验证

  1. 执行-get-copyToLocal时, 加上选项: -ignoreCrc

  2. java代码中, 调用fs.setVerifyChecksum(false)

Copyright © 尚硅谷大数据 2013-2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-02-14 02:59:46

results matching ""

    No results matching ""