Hadoop自带一套原子操作用于数据I/O操作。主要考虑的问题是数据完整性、数据压缩、序列化、on-disk数据结构。
5.1 数据完整性
- 如果需要处理的数据大到Hadoop的处理极限,数据损坏的几率还是很高的。
- 检测数据是否损坏的常用措施是在数据第一次引入系统时计算校验和(checksum),并在数据通过一个不可靠的通道传输后再次计算校验和。但是该技术只能检测数据错误但是不能修复数据,且校验和也有可能损坏。
- Hadoop ChecksumfileSystem 使用CRC-32计算校验和,HDFS则用一个更有效的变体CRC-32C。
5.1.1 HDFS的数据完整性
- HDFS会对所有写入的数据计算校验和,并在读取数据时验证校验和。
- datanode负责在存储数据及校验和之前对数据进行验证。包括收到客户端数据或者复制其他datanode数据时执行校验操作。管线中的最后一个datanode负责验证校验和,若检测到错误,会抛出一个IOException异常的一个子类,应用程序需要对该异常做出处理,比如重试。
- 每个datanode也会定期扫描数据,检测是否存在数据错误。
- HDFS存储着每个数据块的复本(replica),因此可以修复损坏的数据块。
- 可以用fs -checksum来检查一个文件的校验和,可以检查两个文件是否具有相同的内容。
5.1.1 LocalFileSystem
Hadoop的LocalFileSystem执行客户端的校验和验证。
5.1.1 ChecksumFileSystem
LocalFileSystem通过ChecksumFileSystem实现自己的任务。
5.1 压缩
5.2.1 codec
codec是压缩-解压缩算法的一种实现,在Hadoop中一个对CompressionCode接口的实现代表一个codec。
5.2.1 压缩和输入分片
- 不压缩可以分片(spliting)处理,gzip压缩后无法分片处理。
- LZO压缩的文件,在预处理时使用索引工具,可实现文件的可切分特性。
- bzip2提供不同数据块之间的同步标识,因而它支持切分。
- 应该使用哪种切分格式?一些建议,按照效率从高到低排列:
- 使用容器文件格式
- 使用支持切分的压缩格式
- 在应用中将问卷切分成块
- 存储未经压缩的文件
5.2.1 在MapReduce中使用压缩
5.3 序列化
- 序列化,是指将结构化对象转化为字节流在网络间传输或写入磁盘进行永久存储的过程。反序列化是指将字节流转化为结构化对象的逆过程。
- 序列化用于分布式数据处理的两大领域:进程间通信和永久存储。
- Hadoop中,系统间多个节点间使用RPC进行交互,RPC序列化格式如下:
- 紧凑
- 快速
- 可扩展
- 支持多语言互操作
- Hadoop使用自己的序列化格式writable