Hadoop中的序列文件格式

时间:2020-01-09 10:34:35  来源:igfitidea点击:

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格式。