第五章 Hadoop的I/O操作
- 数据完整性
检测数据是否损坏的常见措施是在数据第一次引入系统时计算检验和并在数据通过一个不可靠的通道进行传输时,再次计算检验和,这样就能发现数据是否损坏。
⓵HDFS的数据完整性
HDFS会对写入的所有数据计算检验和,并在读取数据时验证检验和。HDFS存储着每个数据块的复本,因此它可以通过数据复本来修复损坏的数据块,进而得到一个新的、完好无损的复本。
⓶LocalFileSystem
Hadoop的LocalFileSystem执行客户端的检验和验证。我们也可以仅用校验和计算,特别是在底层文件系统本身就支持校验和的时候。如果想针对一些读操作禁用校验和,这个方案非常有用。FileSystem fs = new RawLocalFileSystem();
⓷ChecksumFileSystem
LocalFileSystem通过ChecksumFileSystem来完成自己的任务,有了这个类,向其他无校验和系统加入校验和就非常简单。
FileSystem rawFs = ...
FileSystem checksumdFs = new ChecksumFileSystem(rawFs);
- 压缩
文件压缩有两大好处:减少存储文件所需要的磁盘空间,并加速数据在网络和磁盘上的传输。可切分压缩格式尤其适合MapReduce。bzip2可以切分,LZO文件已经在预处理过程被索引了,那么LZO文件是可切分的。
⓵Codec
Codec是压缩——解压缩算法的一种实现。一个CompressionCodec接口的实现代表一个Codec。
➊通过CompressionCodec对数据流进行压缩和解压缩。如果要对写入输出数据流的数据进行压缩,可用createOutputStream(OutputStream out),新建一个CompressionOutputStream对象。对输入数据流中读取的数据进行解压缩的时候,则调用createInputStream(InputStream in)获取CompressionInputStream。CompressionOutputStream和CompressionInputStream能够重制其底层的压缩或解压缩方法,对于某些将部分数据流压缩为单独数据块的应用,这个能力是非常重要的。
➋通过CompressionCodecFactory推断CompressionCodec:通过使用其getCodec()方法,CompressionCodecFactory提供了一种可以将文件扩展名映射到一个CompressionCodec方法,该方法取文件的Path对象作为参数。
➌原生类库:为了提高性能,最好使用“原生”类库来实现压缩和解压缩。
➍CodecPool:如果使用的是原生代码库并且需要在应用中执行大量压缩和解压缩操作,可以考虑使用CodecPool。
⓶压缩和输入分片:在考虑如何压缩将由MapReduce处理的数据时,理解这些压缩格式是否支持切分是非常重要的。