数据完整性
检测数据完整性的常见方法:在数据第一次引入系统时计算校验和(checksum),并在每一次通道传输时再次计算,比较两次校验和是否匹配,这只能检测数据是否有损坏,而不能修复数据
常见的错误检测码是CRC-32(32位循环冗余校验),任何大小的数据都计算获取32位大小的校验和
Hadoop ChecksumFileSystem使用CRC-32, Hadoop HDFS使用更有效的变体CRC-32C
HDFS数据完整性
1) dfs.bytes-pr-checksum指定每多少字节的数据计算一次校验和,默认512bytes,而CRC-32只占4bytes,存储开销不到1%
2) 写入
datanode收到客户端数据或者其他datanode的副本数据时会进行校验,如果检测到错误,客户端就会收到一个IOException异常的子类,客户端可以重试写入操作来处理这个异常
正在写的客户端把数据和校验和发送到datanode组成的管线,管线中的最后一个datanode负责验证校验和,即如果前面的datanode都正常,则由最后一个datanode发送确认到客户端
3) 读取
客户端从datanode读取数据时计算校验和,与datanode中存储的校验和比较
每个datanode都保存了一份校验和验证的持久化日志,记录数据块的最近验证时间,客户端验证成功后告诉datanode更新该日志,这份日志对于检测损坏很有帮助
4) datanode自身
datanode有一个后台进程DataBlockScanner,定期验证存储在datanode上的所有数据块,解决物理存储媒体上损坏的问题
5) 数据修复
客户端检测到错误,抛出ChecksumException -> 告诉namenode哪个datanode的哪个数据块损坏 -> namenode标记副本为已损坏或者把坏的副本拷贝到其他datanode -> 找一个新的datanode复制正确的数据块,保持副本数不变 -> 删除损坏的数据块
6) 禁用校验和:在调用open()之前调用setVerifyChecksum(false)
命令行禁用: -ignoreCrc -get = -copyToLocal
检查文件校验和: hadoop fs -checksum
LocalFileSystem
1) 执行客户端的校验和验证,在文件块校验和的目录下建立隐藏文件filename.crc
2) 计算开销低,只能增加少许读写操作,这对于保证数据完整性可接受
3) 禁用校验和验证,使用RawLocalFileSystem代替LocalFileSystem,因为RawLocalFileSystem本身就支持校验和验证
4) 设置全局校验和验证,需要将fs.file.impl属性设置为RawLocalFileSystem实现文件URI映射;也可以新建RawLocalFileSystem实例操作校验和验证
FileSystem fs = new RawLocalFileSystem()
ChecksumFileSystem
LocalFileSystem使用ChecksumFileSystem,使用ChecksumFileSystem向文件系统添加校验和很简单,这个类本身继承自FileSystem
FileSystem csFileSystem = new ChecksumFileSystem(rawFS);
底层文件系统“raw file system”,与上述的RawLocalFileSystem不是一回事
获取底层文件系统 getRawFileSystem()
获取任意文件的校验和文件路径 getChecksumFile()
报告校验和失败 reportChecksumFailure()
最后
以上就是任性网络最近收集整理的关于Hadoop I/O操作 数据完整性保持的全部内容,更多相关Hadoop内容请搜索靠谱客的其他文章。
发表评论 取消回复