刘涌 韩伟 赵静雅

摘要:Hadoop在存储数据的过程中,首先要保证的就是数据的完整性,通常,Hadoop是根据由数据计算出的校验和进行数据验证的,从而保证数据的完整性,为了达到持续保持完整性的目的,Hadoop会分别在I/O过程中和利用定时扫描程序验证数据并具备一套完善的纠正机制;在此前提下,通过文件的压缩,Hadoop可以有效地减少文件占用的空间并提高文件传输速度,相关的压缩算法有bzip2和LZO等。

关键词:Hadoop;HDFS ;I/O ;压缩

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)15-0239-01

1 引言

Hadoop用户都希望自己的数据在存储和调用的过程中,不会丢失或损坏,尽管磁盘和网络中的每个I/O操作在读写过程中发生错误的情况非常少,但当系统中需要处理的数据量达到Hadoop的处理极限时,数据的误码率会明显升高。

检测数据是否损坏的主要手段是通过校验和的方式去验证数据:在数据产生时可根据相应协议对数据进行叠加相加的操作计算出初始校验和,当数据通过一个不可靠通道到达目的地址后使用相同的方法计算校验和,将两次校验和结果匹配比较,如果结果为不匹配则证明数据已经损坏,反之则说明数据极有可能是正常传输的数据。

2 HDFS的数据完整性

HDFS会对所有写入的数据进行校验和计算,并在读取时进行校验和验证。它针对每个由io.bytes.per.checksum指定字节的数据计算校验和。默认情况下是512Bytes,由于CRC-32循环冗余校验的校验和是32位,即4Bytes,所以存储校验和的额外开销低于1%。

Hadoop通过校验和验证数据的过程与其他系统中校验和的应用并没有本质的不同:数据节点DataNode在收到数据后存储数据并验证校验和,正在写数据的客户端将数据机器校验和发送到由一系列DataNode组成的管线,管线中最后一个DataNode负责验证校验和,如果检测到校验和不匹配,客户端会收到一个ChecksumException异常,它是IOException异常的一个子类,后者会以应用程序特定的方式进行响应处理,如重新发送等。

反之,在客户端从DataNode中读取数据时,也会验证校验和,将他们与DataNode中存储的校验和进行比较,每个DataNode都持续保存一个用于验证的校验和日志persistent log of checksum verification,当客户端成功验证校验和后,DataNode也会更新该日志, 确保数据和校验和均保持最新的确认正确状态。

要彻底持久的保持数据的完整性,除了在I/O过程中均进行验证外,还要防止小概率事件的发生,即每个DataNode都会在后台运行一个DataBlockScanner,定期扫描验证存储在DataNode上的所有数据块,从而保证已经存储的数据不会因为物理存储媒介的原因造成数据的损失。

HDFS存储着每个数据块的复本,DataNode通过上述过程及时的发现数据的损坏,利用ChecksumException报警,将该数据块复本标记为已损坏,暂时屏蔽这个复本的I/O操作,之后,安排该数据块的一个其他复本复制到另一个DataNode,最终将已损坏的数据块复本删除,从而保持所有数据的完整性。

3 压缩与切分

对文件进行压缩,不仅可以减少存储文件所需占用的磁盘空间,还可以提高文件在网络和磁盘中传输的速度,因此,在Hadoop中数据文件的压缩尤为重要,常见的压缩格式有:deflate、gzip、bzip2、LZO、LZ4、Snappy等。

所有的压缩算法都需要在速度与压缩率之间权衡,提高压缩、解压缩速度,通常就意味着无法进行复杂的压缩,即能压缩减少的空间很少,因此,所有压缩工具都提供9级不同程度的压缩参数供使用者自由选择,选项-1为优化压缩速度,选项-9为优化压缩空间。不同的压缩工具的压缩性能不同:bzip2的压缩能力比gzip强,但压缩速度稍慢于后者,尽管bzip2本身的解压速度比压缩速度快,但仍比其他压缩格式要慢一些;LZO、LZ4和Snappy的压缩速度都比gzip高一个数量级,但压缩效率稍逊一筹;而LZ4和Snappy的解压速度比LZO高很多。

上述压缩算法中仅有bzip2可切分,如果LZO文件已经在预处理过程中被索引,则LZO文件是可切分的。是否支持切分,决定了是否可以搜索数据流的任意位置并进一步往下读取数据,这种特性尤其适合MapReduce。在Hadoop中,使用这两种支持切分的压缩格式要比在应用中将文件切分成块,再为每个数据块进行压缩至大小近似于HDFS块的大小的效率更高; 如果想要进一步提高效率,可以使用顺序文件、RCFile或Avro等同时支持压缩和切分的文件格式,最好再与一个快速压缩工具联合使用,如LZO、LZ4或Snappy等。当然,以上三种手段都比不压缩文件直接存储的效率更高。

4 结束语

Hadoop中处理的数据往往动辄好几个TB,在这种情况下,既要保证数据的正确性和完整性,又要考虑数据占用的空间尽可能小,存储和运行数据块的速度尽可能快,因此,对Hadoop中的I/O操作进行分析优化就显得十分有必要,本文仅就上述几方面进行了简述,关于I/O相关工作,还有很大的发展空间,具有广阔的开发前景。

参考文献:

[1] 张子凡. OpenStack部署实践[M].北京:人民邮电出版社,2014:1-364.

[2] 鲍亮,李倩. 实战大数据[M].北京:清华大学出版社,2014:1-327.

[3] 吴萍,朱晴婷. 算法与程序设计基础(Python版)[M].北京:清华大学出版社,2015:30-270.