导入
序列文件:简介
本课程讲解了序列文件的结构。
序列文件:简介
除了支持文本格式外,Hadoop 还支持二进制格式。序列文件就是其中一种。二进制数据占用的磁盘空间比文本数据更少。Map 任务产生的临时输出数据通常以序列文件的形式存储。
Hadoop 面临的一个问题是存储大量小文件。当系统中存在过多小文件时,NameNode 会面临内存不足的问题。同样,如果一个 MapReduce 作业的输入由大量小文件组成,那么 Mapper 任务的数量(每个文件对应一个任务)将远多于文件数量较少但单个文件较大的情况。为解决这些问题,序列文件应运而生。它主要实现以下两个功能:
- 可作为持久化的数据结构,用于存储二进制的键值对。
- 可作为较小文件的容器。在将小文件存储为序列文件时,文件名作为键,文件内容作为值。
序列文件在 Hadoop 生态系统中得到良好支持,但在 Java 之外的支持非常有限。
记录的组成
序列文件内部结构如下:
...
文件的前三个字节为 "SEQ",随后是一个表示版本号的单字节。头部之后是记录数据和一个 sync 块。头部包含元信息,如键和值类的类名、压缩配置、用户自定义元数据以及同步标记。
单条记录由四个部分组成:
- 记录长度:以字节数表示。该字段本身由 4 个字节构成,表示一个整数。
- 键长度:以字节数表示。该字段同样由 4 个字节构成,表示一个整数。
- 键:被序列化后写入序列文件。
- 值:被序列化后写入序列文件。
同步标记
同步标记允许读取器从当前文件位置跳转到下一个记录边界。通过同步点,多个 Map 任务可以独立地读取和处理序列文件的不同部分。同步标记带来的存储开销小于 1%。我们将在下一课中深入探讨同步标记。
压缩
序列文件可以呈现为以下三种形式:
- 未压缩
- 记录压缩
- 块压缩
未压缩和记录压缩的形式如下所示。在记录压缩模式下,序列文件中的每条记录的值会被压缩,其余字段保持未压缩状态。每隔若干条记录后,会插入一个同步标记。
...
在块压缩模式下,多个记录被组合成一个块,直到达到可配置的最大大小。然后对整个块内的所有记录进行压缩。块压缩更为高效,因为其压缩密度高于记录压缩。需要注意的是,每个块之前都会添加一个同步标记。
...