DataCastle 2016-04-21
一般数据存储模式分为行存储、列存储以及混合存储。
行存储模式就是把一整行存在一起,包含所有的列,这是最常见的模式。这种结构能很好的适应动态的查询。但行存储模式有以下两点不足:
列存储模式将每列单独存储或者将某几个列作为列组存在一起。列存储在执行查询时可以避免读取不必要的列。而且一般同列的数据类型一致,读取范围相对多列混合更小,这种情况下压缩数据能达到比较高的压缩比。但是这种结构在重建行时效率比较低。
混合存储模式是将行存储和列存储混合使用的一种结构。
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:
ORCFile对RCFile进行优化,和RCFile格式相比,ORC File格式有以下优点:
5、测试总结
下面对这sequencefile和rcfile 文件格式结合GzipCodec、DefaultCodec做了测试对比。