Hadoop中的序列文件格式
Hadoop中的序列文件是平面文件,以序列化键/值对的形式存储数据。序列文件格式是Hadoop支持的二进制文件格式之一,它与MapReduce(以及Hive和PIG)很好地集成在一起。
Hadoop中的Sequence文件的某些功能如下:
- 以二进制形式存储数据,因此在想要将图像存储在HDFS中,将复杂的数据结构建模为(键,值)对的情况下效果很好。
- Hadoop中的序列文件支持压缩和拆分。压缩序列文件时,不会将整个文件压缩为一个整体,而是将记录或者记录块压缩到序列文件中。由于该顺序,即使使用的压缩器不能像Snappy,Lz4或者Gzip这样不可拆分,文件也可以支持拆分。
- 序列文件也可以用作存储大量小文件的容器。由于Hadoop最适合大文件,因此在序列文件中存储大量小文件可以提高处理效率,并且还需要较少的NameNode内存,因为它必须存储有关一个序列文件的元数据,而不是许多小文件。
- 由于数据存储在Sequence文件的(键,值)对中,因此在内部使用SequenceFile存储映射的临时输出。
SequenceFile压缩类型
对于Hadoop中的序列文件,有三种压缩选项。
NONE -两个键/值均未压缩。
RECORD –如果序列文件压缩类型为RECORD,则仅压缩值。
BLOCK –如果序列文件压缩类型为BLOCK,则同时压缩键和值。键和值都分别收集在"块"中并进行了压缩。 "块"的大小是可配置的。我们将必须在core-site.xml中修改以下属性。 io.seqfile.compress.blocksize –块压缩的SequenceFiles中压缩的最小块大小。默认值为1000000字节(100万字节)。
在序列文件中同步点
在序列文件中,每隔100个字节记录一次同步标记。由于这些同步点,序列文件是splittale的,可用作MapReduce的输入。
Hadoop中的SequenceFile格式
根据所选的压缩类型,共有三种不同的序列文件格式。请注意,标头格式在所有内容中都相同。
SequenceFile标头格式
版本-3个字节的魔术头SEQ,后跟1个字节的实际版本号(例如SEQ4或者SEQ6)
KeyClassName –密钥类
ValueClassName –值类别
压缩–一个布尔值,指定是否为此文件中的键/值打开压缩。
BlockCompression –一个布尔值,指定是否为此文件中的键/值打开块压缩。
压缩编解码器– CompressionCodec类,用于压缩键和/或者值(如果启用了压缩)。
元数据-此文件的SequenceFile.Metadata。
Sync –同步标记,表示标题的结尾。
未压缩的SequenceFile格式
标头
记录长度
键长
键
值
每隔几百个字节左右就有一个同步标记。
记录压缩的序列文件格式
标头
记录长度
键长
键
压缩值
每隔100个字节左右就有一个同步标记。
记录序列文件格式
块压缩序列文件格式
标头
记录块块中未压缩的记录数
压缩键长块大小
压缩的密钥长度块
压缩键块大小
压缩键块
压缩值长度块大小
压缩值长度块
压缩值块大小
压缩值块
每个块都有一个同步标记。
序列文件块格式
SequenceFile类
SequenceFile提供分别用于写入,读取和排序的SequenceFile.Writer,SequenceFile.Reader和SequenceFile.Sorter类。
基于SequenceFile.CompressionType的三个SequenceFile Writer用于压缩键/值对:
作者:未压缩的记录。
RecordCompressWriter:记录压缩的文件,仅压缩值。
BlockCompressWriter:块压缩文件,键和值均被压缩。
推荐的方法是使用SequenceFile提供的静态createWriter方法来选择首选格式。
SequenceFile.Reader可以读取以上任何SequenceFile格式。