Hive文件存储格式——SequenceFile


发布于 2017-04-22 / 26 阅读 / 0 评论 /
SequenceFile是Hadoop提供的一种二进制文件支持,具有使用方便、可分割、可压缩的特点。

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)需要一个合并文件的过程,且合并后的文件不方便查看。