Hadoop官网这样描述:
Data Integrity:
The HDFS client software implements checksum checking(by CRC-32(Cyclic Redundancy Check)) on the contents of HDFS. When a client creates an HDFS file, it computes a checksum of each block of the file and stores these checksums in a separate hiddle file (.filename.crc)in the same HDFS namespace. When a client retrives file contents, it verifies that the data (it received from each DataNode) matches the checksum stored in the associated checksum file. If not, then client can opt to retrieve that block from another DataNode (that has a replica of that block).
Hadoop 采用HDFS作为默认的文件系统,故须讨论两方面的数据完整性:
1. 本地文件系统的数据完整性:
在Hadoop中,本地文件系统的Data Integrity由client负责。重点是在存储和读取文件时进行校验和的处理。具体做法是,每当Hadoop创建文件a时,Hadoop就会同时在同一文件夹下创建隐藏文件.a.crc,这个文件记录了文件a的校验和。针对数据文件的大小,每512个字节Hadoop就会生成一个32位的校验和(4Bytes),可通过在hadoop-core-1.0.4.jar解压后的hadoop-core-1.0.4中修改core-defalut.xml下的io.bytes.per.checksum的大小来修改每个校验和所针对的文件大小。如下所示:
<property>
<name>io.bytes.per.checksum</name>
<value>512</value>
<description>The number of bytes per checksum. Must not be larger than
io.file.buffer.size.</description>
</property>
亦可通过修改core-defalut.xml下的fs.file.impl的内容或程序来禁用校验和机制,如下所示:
<property>
<name>fs.file.impl</name>
<value>org.apache.hadoop.fs.LocalFileSystem</value>
<description>The FileSystem for file: uris.</description>
</property>
1> 将org.apache.hadoop.fs.LocalFileSystem改为org.apache.hadoop.fs.RawLocalFileSystem;
2> FileSystem fs = new RawFileSystem();
fs.initialize(null,conf);
当需要校验和机制时,可方便地调用它来服务(org.apache.hadoop.fs.ChecksumFileSystem):
FileSystem rawFS = new RawFileSystem();
FileSystem checksumFS = new ChecksumFileSystem(rawFS);
2. HDFS的数据完整性:
Generally, HDFS会在三钟情况下检验校验和:
1> DataNode接收数据后,存储数据前
DataNode接收数据一般有两种情况:一是用户从client上传data; 二是DataNode从other DataNode上接收data; 当 client上传数据时,Hadoop会根据预定规则形成一条数据管线(pipeline),不仅要在client这个节点上保存data, 而且还须将data备份到3个DataNode上,一个备份文件1在同一机架的本地主机上,另外两个备份2,3在不同机架i的两台主机上。备份1在接收数据的同时也会把接收到的数据发送给备份2所在的机器,故如果过程执行顺利,三个备份形成的时间相差不多(相对依次备份而言)。Notice:hadoop不会在data每流动到一个DataNode时都检查校验和,它只会在数据流动到最后一个节点时才会检验校验和;
2> client读取DataNode上的数据时
Hadoop会在client读取DataNode上的数据时检查校验和。
3> DataNode后台守护进程的定期检测
DataNode会在后台运行DataBlockScanner,这个程序会定期检测此DataNode上的所有数据块。
3. 数据恢复策略
当Hadoop发现某数据块已经失效时,可采用复制完整的备份方式来恢复数据,而此时需要禁用校验和。
禁用校验和的最重要目的并不是save time, 用于检验校验和的开销一般情况都是可以接受的,禁用检验和的主要原因是:如果你不禁用校验和,你无法下载那些已经损坏的文件来查看是否可以挽救,而sometimes即使是只能save一小部分file也是值得的。
两种方式禁用校验和:
1> 在open()读取文件前,设置FileSystem中的setVerifyChecksum值为false.
FileSystem fs = new FileSystem();
fs.setVerifyChecksum(false);
2> shell命令
bin/hadoop fs -get [ignoreCrc] [-crc] <src> <localdst>
bin/hadoop fs -copyTolocal [ignoreCrc] [-crc] URI <localdst>