`

hive文件存储格式

    博客分类:
  • HIVE
阅读更多
整理了一下网上的几种Hive文件存储格式的性能与Hadoop的文件存储格式。

Hive的三种文件格式:TEXTFILE、SEQUENCEFILE、RCFILE中,TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的,RCFILE是基于行列混合的思想,先按行把数据划分成N个row group,在row group中对每个列分别进行存储。另:Hive能支持自定义格式,详情见:Hive文件存储格式
基于HDFS的行存储具备快速数据加载和动态负载的高适应能力,因为行存储保证了相同记录的所有域都在同一个集群节点。但是它不太满足快速的查询响应时间的要求,因为当查询仅仅针对所有列中的 少数几列时,它就不能跳过不需要的列,直接定位到所需列;同时在存储空间利用上,它也存在一些瓶颈,由于数据表中包含不同类型,不同数据值的列,行存储不 易获得一个较高的压缩比。RCFILE是基于SEQUENCEFILE实现的列存储格式。除了满足快速数据加载和动态负载高适应的需求外,也解决了SEQUENCEFILE的一些瓶颈。

下面对这几种几个作一个简单的介绍:

TextFile:

Hive默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
可结合Gzip、Bzip2、Snappy等使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。

SequenceFile:
SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以<key,value>的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程。

SequenceFile的文件结构图:


Header通用头文件格式:
SEQ 3BYTE
Nun 1byte数字
keyClassName
ValueClassName
compression (boolean)指明了在文件中是否启用压缩
blockCompression (boolean,指明是否是block压缩)
compression codec
Metadata 文件元数据
Sync 头文件结束标志
Block-Compressed SequenceFile格式



RCFile
RCFile是Hive推出的一种专门面向列的数据格式。 它遵循“先按列划分,再垂直划分”的设计理念。当查询过程中,针对它并不关心的列时,它会在IO上跳过这些列。需要说明的是,RCFile在map阶段从 远端拷贝仍然是拷贝整个数据块,并且拷贝到本地目录后RCFile并不是真正直接跳过不需要的列,并跳到需要读取的列, 而是通过扫描每一个row group的头部定义来实现的,但是在整个HDFS Block 级别的头部并没有定义每个列从哪个row group起始到哪个row group结束。所以在读取所有列的情况下,RCFile的性能反而没有SequenceFile高。

下面介绍行存储、列存储(详细参照:Facebook数据仓库揭秘:RCFile高效存储结构)

行存储

HDFS块内行存储的例子:

基于Hadoop系统行存储结构的优点在于快速数据加载和动态负载的高适应能力,这是因为行存储保证了相同记录的所有域都在同一个集群节点,即同一个 HDFS块。不过,行存储的缺点也是显而易见的,例如它不能支持快速查询处理,因为当查询仅仅针对多列表中的少数几列时,它不能跳过不必要的列读取;此 外,由于混合着不同数据值的列,行存储不易获得一个极高的压缩比,即空间利用率不易大幅提高。

列存储
HDFS块内列存储的例子

在HDFS上按照列组存储表格的例子。在这个例子中,列A和列B存储在同一列组,而列C和列D分别存储在单独的列组。查询时列存储能够避免读不必要的列, 并且压缩一个列中的相似数据能够达到较高的压缩比。然而,由于元组重构的较高开销,它并不能提供基于Hadoop系统的快速查询处理。列存储不能保证同一 记录的所有域都存储在同一集群节点,行存储的例子中,记录的4个域存储在位于不同节点的3个HDFS块中。因此,记录的重构将导致通过集群节点网络的大 量数据传输。尽管预先分组后,多个列在一起能够减少开销,但是对于高度动态的负载模式,它并不具备很好的适应性。

RCFile结合行存储查询的快速和列存储节省空间的特点:首先,RCFile保证同一行的数据位于同一节点,因此元组重构的开销很低;其次,像列存储一样,RCFile能够利用列维度的数据压缩,并且能跳过不必要的列读取。
HDFS块内RCFile方式存储的例子:



数据测试
源表数据记录数:67236221

第一步:创建三种文件类型的表,建表语法参考Hive文件存储格式

Sql代码  收藏代码
--TextFile 
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; 
INSERT OVERWRITE table hzr_test_text_table PARTITION(product='xxx',dt='2013-04-22') 
SELECT xxx,xxx.... FROM xxxtable WHERE product='xxx' AND dt='2013-04-22'; 
 
--SquenceFile 
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 io.seqfile.compression.type=BLOCK; 
INSERT OVERWRITE table hzr_test_sequence_table PARTITION(product='xxx',dt='2013-04-22') 
SELECT xxx,xxx.... FROM xxxtable WHERE product='xxx' AND dt='2013-04-22'; 
 
--RCFile 
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; 
INSERT OVERWRITE table hzr_test_rcfile_table PARTITION(product='xxx',dt='2013-04-22') 
SELECT xxx,xxx.... FROM xxxtable WHERE product='xxx' AND dt='2013-04-22'; 


第二步:测试insert overwrite table tablename select.... 耗时,存储空间
类型 insert耗时(S) 存储空间(G)
Sequence
97.291
7.13G
RCFile
120.901
5.73G
TextFile
290.517
6.80G

insert耗时、count(1)耗时比较:





第三步:查询响应时间

    测试一

Sql代码  收藏代码
方案一,测试整行记录的查询效率: 
select * from hzr_test_sequence_table where game='XXX' ;   
select * from hzr_test_rcfile_table where game='XXX' ;  
select * from hzr_test_text_table where game='XXX' ;  
 
方案二,测试特定列的查询效率: 
select game,game_server from hzr_test_sequence_table where game ='XXX'; 
select game,game_server from hzr_test_rcfile_table where game ='XXX'; 
select game,game_server from hzr_test_text_table where game ='XXX'; 

文件格式
查询整行记录耗时(S)
查询特定列记录耗时(S)
sequence
42.241
39.918
rcfile
37.395
36.248
text
43.164
41.632

方案耗时对比:




   测试二:
本测试目的是验证RCFILE的数据读取方式和Lazy解压方式是否有性能优势。数据读取方式只读取元数据和相关的列,节省IO;Lazy解压方式只解压相关的列数据,对不满足where条件的查询数据不进行解压,IO和效率都有优势。

方案一:
记录数:698020

Sql代码  收藏代码
insert overwrite local directory 'XXX/XXXX' select game,game_server from hzr_test_xxx_table where game ='XXX'; 


方案二:
记录数:67236221

Sql代码  收藏代码
insert overwrite local directory 'xxx/xxxx' select game,game_server from hzr_test_xxx_table; 

方案三:
记录数:

Sql代码  收藏代码
insert overwrite local directory 'xxx/xxx' 
select game from hzr_xxx_rcfile_table; 

文件类型 方案一 方案二 方案三
TextFile 54.895 69.428 167.667
SequenceFile 137.096 77.03   123.667
RCFile 44.28 57.037 89.9


上图表现反应在大小数据集上,RCFILE的查询效率高于SEQUENCEFILE,在特定字段数据读取时,RCFILE的查询效率依然优于SEQUENCEFILE。
分享到:
评论

相关推荐

    hive文件存储格式对比实验测试数据

    hive测试数据,其中为日志类型,用于验证在hive中主流文件存储格式对比实验

    CDH550@hive存储格式和HQL材料

    CDH550下的hive的存储格式介绍和HQL的详细说明。一般数据存储模式主要有三种,1)行存储;2)列存储;3)混合存储。 1)行存储模式就是:把一整行存在一起,包含所有的列,这是最常见的模式。这种结构能很好的适应...

    hive从入门到放弃(六)——常用文件存储格式.doc

    hive从入门到放弃(六)——常用文件存储格式.doc

    利用Hive进行复杂用户行为大数据分析及优化案例

    09_Hive中数据文件的存储格式介绍及对比 10_常见的压缩格式及MapReduce的压缩介绍 11_Hadoop中编译配置Snappy压缩 12_Hadoop及Hive配置支持snappy压缩 13_Hive中的常见调优 14_Hive中的数据倾斜及解决方案-三种join...

    cpp-ApacheORC文件格式是一种Hadoop生态圈中的列式存储格式

    Apache ORC 文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。

    Hive编程指南中文版

    第15章 自定义Hive文件和记录格式 第16章 Hive的Thrift服务 第17章 存储处理程序和NoSQL 第18章 安全 第19章 锁 第20章 Hive和Oozie整合 第21章 Hive和亚马逊网络服务系统 第22章 HCatalog 第23章 案例研究

    hive编程指南中文版

    · 从文件到外部数据库,自定义数据存储格式和存储选项。 · 将数据载入表中以及从表中抽取数据,并使用查询、分组、过滤、连接和其他常规查询方法。 · 获得创建用户自定义函数(UDF)的最佳方法。 · 了解应该使用...

    hive-笔记--hive常用用法

    内部表和外部表,导入数据,导出数据,将数据从hive的表中导出到本地磁盘目录中,HIVE的存储文件格式,修改表的分区,多重插入,HIVE的自定义函数功能,使用explode —— 行转列,配合lateral view 列转行方便统计,...

    Hive用户指南(Hive_user_guide)_中文版.pdf

    (” n”)以及读取文件数据的方法( Hive 中默认有三个文件格式 TextFile , SequenceFile 以及 RCFile )。由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,因此, Hive 在加载的...

    Hive编程指南

    · 从文件到外部数据库,自定义数据存储格式和存储选项。 · 将数据载入表中以及从表中抽取数据,并使用查询、分组、过滤、连接和其他常规查询方法。 · 获得创建用户自定义函数(UDF)的最佳方法。 · 了解应该使用...

    【63课时完整版】大数据实践HIVE详解及实战

    45.Hive中数据文件的存储格式介绍及对比 46.常见的压缩格式及MapReduce的压缩介绍 47.Hadoop中编译配置Snappy压缩 48.Hadoop及Hive配置支持snappy压缩 49.Hive中的常见调优 50.Hive中的数据倾斜及解决方案-三种join...

    1-4-Hive+and+Impala.pdf

    Impala 与Hive都是构建在Hadoop之上的数据查询工具各有不同的侧重适应面,但从客户端使用来看Impala与Hive有很多的共同之处,如数据表元数 据、ODBC/JDBC驱动、SQL语法、灵活的文件格式、存储资源池等。Impala与Hive...

    apache-hive-2.3.5-bin.tar.gz

    hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的...

    1、通过亿级数据量在hive和impala中查询比较text、orc和parquet性能表现(一)

    本文通过在hdfs中三种不同数据格式文件存储相同数量的数据,通过hive和impala两种客户端查询进行比较。 本文前提:熟悉hadoop、hive和impala、kafka、flink等,并且其环境都可正常使用。(在后续的专栏中都会将对应...

    1、通过亿级数据量在hive和impala中查询比较text、orc和parquet性能表现(二)

    本文通过在hdfs中三种不同数据格式文件存储相同数量的数据,通过hive和impala两种客户端查询进行比较。 本文前提:熟悉hadoop、hive和impala、kafka、flink等,并且其环境都可正常使用。(在后续的专栏中都会将对应...

    使用kettle将mysql中的数据导入到hive中

    先说说思路:1是直接从mysql输出至hive中,另外一个是先将数据搞到hdfs中,再load一下,当然这只是textfile存储格式而言,若是ORC等其他列式存储的话建议先搞一个textfile格式的中间表,再insert into table select ...

    15-Hadoop压缩和存储

    Hadoop压缩和存储思维导图,便捷整理思路,Hadoop压缩配置、文件存储格式、Hive支持格式、存储和压缩结合

    完整图文版 阿里巴巴数据产品平台 大数据与云计算技术系列教程 Hadoop之Hive学习笔记(共63页).pdf

    Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive 中默认有三个文件格式 ...

    Impala和Hive的关系(详解)

    Impala与Hive都是构建在Hadoop之上的数据查询工具各有不同的侧重适应面,但从客户端使用来看Impala与Hive有很多的共同之处,如数据表元数据、ODBC/JDBC驱动、SQL语法、灵活的文件格式、存储资源池等。Impala与Hive在...

Global site tag (gtag.js) - Google Analytics