||
HDFS数据完整性
数据完整性常见技术
为了保证数据的完整性,一般采用数据校验技术:
1)奇偶校验技术
2)MD5,sha1等校验技术
3)CRC-32循环冗余校验技术
4)ECC内存纠错校验技术
数据完整性
1)HDFS以透明方式校验所有写入的数据,针对数据的io.bytes.per.checksum()字节创建一个单独的校验和,如果节点检测数据错误,就会报CheckSumException异常。
2)除了在读取数据时进行验证,数据节点也会在后台运行一个线程DataBlockScanner(数据块检测程序)验证存储在数据节点上的所有块。
3)一旦检测到corrupt block,在heartbeat阶段,DN会收到NN发来的BlockCommand,从其它数据块中拷贝一份新的replica。
LocalFileSystem
1.如果使用本地文件系统file:///,在写一个文件file的时候,会隐式创建一个file.crc文件,包含每个数据块的checksum。
2.使用FileSystem.setVerifyChecksum(false)来禁用校验和验证,也可以在shell命令中使用-ignoreCrc选项
禁用校验和的方法:通过RawLocalFileSystem,原生支持校验和,
1)通过设置fs.file.impl的值为org.apache.hadoop.fs.RawLocalFileSystem
2)建立它的实例
ChecksumFileSystem
LocalFileSystem 继承于ChecksumFileSystem,ChecksumFileSystem提供了文件校验的系统功能。
/****************************************************************
* Implement the FileSystem API for the checksumed local filesystem.
*
*****************************************************************/
@InterfaceAudience.Public
@InterfaceStability.Stable
public class LocalFileSystem extends ChecksumFileSystem {
static final URI NAME = URI.create("file:///");
static private Random rand = new Random();
public LocalFileSystem() {
this(new RawLocalFileSystem());
}
实例代码:
package org.chen.hadoop.ChecksumFileSystem;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.ChecksumFileSystem;
import org.apache.hadoop.fs.LocalFileSystem;
import org.apache.hadoop.fs.Path;
public class TestChecksumFileSystem {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
LocalFileSystem localFS =ChecksumFileSystem.getLocal(conf);
//文件路径
String path = "/home/ch-hduser/myfile/00.data";
System.out.println(localFS.getChecksumFile(new Path(path)));
}
}