1.SequenceFile格式解析
文件格式如下图所示:
SequenceFile的格式是由一个header 跟随一个或多个记录组成。
Header的前三个字节是一个Bytes SEQ代表着版本号,同时header也包括key的名称,value class , 压缩细节,metadata,以及Sync markers。Sync markers的作用在于可以读取任意位置的数据。
在records中,又分为是否压缩格式。当没有被压缩时,key与value使用Serialization序列化写入SequenceFile。当选择压缩格式时,record的压缩格式与没有压缩其实不尽相同,除了value的bytes被压缩,key是不被压缩的。
块压缩是指一次性压缩多条记录,利用记录间的相似性进行压缩,压缩效率高,压缩的块大小默认 1MB。
2.SequenceFile支持数据压缩
SequenceFile支持三种压缩选择:none、record、block。
(1)none:如果没有启用压缩(默认设置)那么每个记录就由它的记录长度(字节数)、键的长度,键和值组成。长度字段为4字节。
(2)record压缩类型:记录压缩格式与无压缩格式基本相同,不同的是值字节是用定义在头部的编码器来压缩。
(3)block压缩类型:块压缩一次压缩多个记录,因此它比记录压缩更紧凑,而且一般优先选择。当记录的字节数达到最小大小,才会添加到块。该最小值由io.seqfile.compress.blocksize中的属性定义。默认值是1000000字节。格式为记录数、键长度、键、值长度、值。
在使用时,通过mapred.output.compression.type参数配置。record压缩率低,所以一般建议使用block压缩。
在Block中,它使所有的信息进行压缩,压缩的最小大小由配置文件中,io.seqfile.compress.blocksize配置项决定。
数据压缩的使用方法如下所示:
set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
set mapred.output.compression.type=BLOCK;
insert overwrite table seqfile_table select * from textfile_table;
3.SequenceFile优缺点
SequenceFile有以下优点:
(1)支持基于记录(Record)或块(Block)的数据压缩。
(2)支持splittable,能够作为MapReduce的输入分片。
(3)修改简单,主要负责修改相应的业务逻辑,而不用考虑具体的存储格式。
SequenceFile有以下缺点:
(1)需要一个合并文件的过程,且合并后的文件不方便查看。