HDFS数据完整性解析

      HDFS存储了大量的用户需要的数据,由于每一个磁盘或者是网络上的I/O操作,可能会对正在读写的数据处理导致数据丢失,或者错误。下面两种数据检验方式,以此来保证数据的完整性,而且这两种检验方式在DataNode节点上是同时工作的。      

1.校验和

       检测损坏数据的常用方法是在第一次进行系统时计算数据的校验和,在通道传输过程中,如果新生成的校验和不完全匹配原始的校验和,那么数据就会被认为是被损坏的。


2.数据块检测程序(DataBlockScanner)

    在DataNode节点上开启一个后台线程,来定期验证存储在它上所有块,这个是防止物理介质出现损减情况而造成的数据损坏。


        关于校验和,HDFS以透明的方式检验所有写入它的数据,并在默认设置下,会在读取数据时验证校验和。正对数据的每一个校验块,都会创建一个单独的校验和,默认校验块大小是512字节,对应的校验和是4字节。DataNode节点负载在存储数据(当然包括数据的校验和)之前验证它们收到的数据,如果此DataNode节点检测到错误,客户端会收到一个CheckSumException。客户端读取DataNode节点上的数据时,会验证校验和,即将其与DataNode上存储的校验和进行比较。每一个DataNode节点都会维护着一个连续的校验和和验证日志,里面有着每一个Block的最后验证时间。客户端成功验证Block之后,便会告诉DataNode节点,Datanode节点随之更新日志。这一点也就涉及到前面说的DataBlockScanner了,所以接下来我将主要讨论DataBlockScanner

scanPeriod一个扫描周期,可以由Datanode的配置文件来设置,配置项是:dfs.datanode.scan.period.hours,单位是小时。

DataBlockScanner 是作为DataNode的一个后台线 程工作的,跟着DataNode一块启动,它的工作流程如下:

HDFS数据完整性解析_第1张图片

扫描日志保存在DataNode节点的一个存储目录中,并放在current/目录下

你可能感兴趣的:(Hadoop,数据,hdfs,工作,exception)