hive数据存储组织

    一般数据存储模式分为行存储、列存储以及混合存储。

    行存储模式就是把一整行存在一起,包含所有的列,这是最常见的模式。这种结构能很好的适应动态的查询。但行存储模式有以下两点不足:

  • 当一行中有很多列,而我们只需要其中很少的几列时,我们也不得不把一行中所有的列读进来,然后从中抽取一些列。这样大大降低了查询执行的效率。
  • 基于多个列做压缩时,由于不同的列数据类型和取值范围不同,压缩比不会太高。

    列存储模式将每列单独存储或者将某几个列作为列组存在一起。列存储在执行查询时可以避免读取不必要的列。而且一般同列的数据类型一致,读取范围相对多列混合更小,这种情况下压缩数据能达到比较高的压缩比。但是这种结构在重建行时效率比较低。

    混合存储模式是将行存储和列存储混合使用的一种结构。

    hive数据存储格式常见包括以下几类:textfile、sequencefile、rcfile、orcfile。其中textfile为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据拷贝到hdfs上不进行处理。SequenceFile,RCFile,ORCFile格式的表不能直接从本地文件导入数据,数据要先导入textFile格式的表中,然后再从textfile表中用insert导入到sequenceFile、RCFile、ORCFile表中。

1、TEXTFILE

     默认格式,数据不做压缩,磁盘开销大,数据解析开销大。

     可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。比如默认块大小是64M,那么输入一个128MB的非压缩文件则可以拆分为128/64=2个MapReduce任务。而如果文件是压缩格式128MB,那么对于文件则只会启动一个Mapper。

2、SEQUENCEFILE

     sequencefile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程。如果你用Java API 编写SequenceFile,并让Hive 读取的话,请确保使用value字段存放数据,否则你需要自定义读取这种SequenceFile 的InputFormat class 和OutputFormat class。

sequencefile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。TEXTFile和SEQUENCEFile都是基于行存储的。

3、RCFILE

     RCFILE是一种列存储相结合的存储方式。其遵循的是“先水平划分,在垂直划分”的设计理念。首先,RCFile保证同一行的数据位于同一节点,因此元组重构的开销很低;其次,像列存储一样,RCFile能够利用维度的数据压缩,并且能跳过不必要的列读取。

RCFile存储结构,其广泛应用于Facebook公司的数据分析系统hive中。首先,RCFile具备相当于行存储的数据加载速度和负载适应能力;其次,RCFile的读优化可以在扫描表格式时避免不必要的列读取,测试显示在多数情况下,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应;再次,RCFile使用列维度的压缩,因此能够有效提升

rcfile文件结构如下:

4、ORCFile

     ORCFile是hive0.11版本引入的新的存储格式,是对之前的RCFile存储格式的优化。每个ORC文件由一个或多个stripe组成,每个stripe250MB大小,这个Stripe实际相当于之前的rcfile里的RowGroup概念,每个Stripe大小250MB,这样能提升顺序读的吞吐率。每个Stripe里有三部分组成,分别是IndexData,RowData,Stripe footer:

  • Index Data:一个轻量级的index,默认是每隔1W行做一个索引。这里做的索引只是记录某行的个字段在RowData中的offset,还包括Column的max和min值。
  • Row Data:存的是具体的数据,和RCFile一样,先取部分行,然后对这些行按列进行存储。与RCFile不同的地方在于每个列进行了编码,分成多个Stream来存储。
  • Stripe Footer:存的是各个Stream的类型,长度等信息。

 ORCFile对RCFile进行优化,和RCFile格式相比,ORC File格式有以下优点:

  • 每个task只输出单个文件,这样可以减少NameNode的负载;
  • 支持各种复杂的数据类型,比如:datetime,decimal,以及一些复杂类型(Struct,list,map,union)
  • 在文件存储了一些轻量级的索引数据;
  • 基于数据类型的模块压缩:integer类型的列用行城长度编码;string类型的列用字典编码。
  • 多个互相独立的RecordReaders并行读相同的文件;
  • 无需扫描markers就可以分割文件。
  • 绑定所需要的内存;
  • metadata的存储用protocol buffers的,所以它支持添加和删除一些列。

5、测试总结

    下面对这sequencefile和rcfile 文件格式结合GzipCodec、DefaultCodec做了测试对比。

    总结:相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式 存储方式,数据加载时性能消耗很大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势。

    建议:设置上述压缩参数hive表文件格式和压缩编码采用Rcfile+Gzip压缩效果最好,比sequencefile节省约33%存储,而且rcfile 在列筛选数据查询效率上比sequencefile高很多。综上建议hive默认参数调整如下:

set mapred.output.compression.type=BLOCK;
set hive.merge.mapredfiles = true;
set hive.merge.mapfiles = true;
set hive.merge.smallfiles.avgsize=160000000;
set hive.exec.compress.output=true;

    hive表文件格式选择:除了etl表其余表建表默认格式为RCFile。对于已经创建的表用ALTER TABLE table_name SET RCFile;修改后续数据的存储格式,这个设置不影响该表之前存储的数据,因为hive在数据读取的时候预判的文件格式。 

猜你喜欢

转载自student-lp.iteye.com/blog/2292873
今日推荐