文档章节

Hive文件存储格式的测试比较

hulubo
 hulubo
发布于 2017/06/05 22:27
字数 1972
阅读 18
收藏 0

整理了一下网上的几种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高。

Java代码 

 收藏代码

  1. RCFile stores table data in a flat file consisting of binary key/value pairs.  
  2.  It first partitions rows horizontally into row splits, and then it vertically  
  3.  partitions each row split in a columnar way. RCFile stores the metadata of a   
  4. row split as the key part of a record, and all the data of a row split as the  
  5.  value part.  

  

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

 

行存储

 

HDFS块内行存储的例子:

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

 

列存储

HDFS块内列存储的例子

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

 

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

HDFS块内RCFile方式存储的例子:



 
 数据测试

源表数据记录数:67236221

 

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

 

Sql代码 

 收藏代码

  1. --TextFile  
  2. set hive.exec.compress.output=true;  
  3. set mapred.output.compress=true;  
  4. set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
  5. set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  
  6. INSERT OVERWRITE table hzr_test_text_table PARTITION(product='xxx',dt='2013-04-22')  
  7. SELECT xxx,xxx.... FROM xxxtable WHERE product='xxx' AND dt='2013-04-22';  
  8.   
  9. --SquenceFile  
  10. set hive.exec.compress.output=true;  
  11. set mapred.output.compress=true;  
  12. set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
  13. set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  
  14. set io.seqfile.compression.type=BLOCK;  
  15. INSERT OVERWRITE table hzr_test_sequence_table PARTITION(product='xxx',dt='2013-04-22')  
  16. SELECT xxx,xxx.... FROM xxxtable WHERE product='xxx' AND dt='2013-04-22';  
  17.   
  18. --RCFile  
  19. set hive.exec.compress.output=true;  
  20. set mapred.output.compress=true;  
  21. set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
  22. set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  
  23. INSERT OVERWRITE table hzr_test_rcfile_table PARTITION(product='xxx',dt='2013-04-22')  
  24. 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代码 

 收藏代码

  1. 方案一,测试整行记录的查询效率:  
  2. select * from hzr_test_sequence_table where game='XXX' ;    
  3. select * from hzr_test_rcfile_table where game='XXX' ;   
  4. select * from hzr_test_text_table where game='XXX' ;   
  5.   
  6. 方案二,测试特定列的查询效率:  
  7. select game,game_server from hzr_test_sequence_table where game ='XXX';  
  8. select game,game_server from hzr_test_rcfile_table where game ='XXX';  
  9. 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代码 

 收藏代码

  1. insert overwrite local directory 'XXX/XXXX' select game,game_server from hzr_test_xxx_table where game ='XXX';  

 

 

方案二:

记录数:67236221

 

Sql代码 

 收藏代码

  1. insert overwrite local directory 'xxx/xxxx' select game,game_server from hzr_test_xxx_table;  

 

方案三:

记录数:

 

Sql代码 

 收藏代码

  1. insert overwrite local directory 'xxx/xxx'  
  2. 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。

本文转载自:http://yugouai.iteye.com/blog/1851606

hulubo
粉丝 15
博文 78
码字总数 19249
作品 0
深圳
项目经理
私信 提问
Hive文件存储格式的测试比较

整理了一下网上的几种Hive文件存储格式的性能与Hadoop的文件存储格式。 Hive的三种文件格式:TEXTFILE、SEQUENCEFILE、RCFILE中,TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的,RCFIL...

Zero零_度
2016/10/24
33
0
Hive格式 Parquet与ORC性能测试报告

一、环境说明 Hadoop集群:使用测试Hadoop集群,节点: hadoop230 hadoop231 hadoop232 hadoop233 这几台机器配置一样,具体参数可参考如下: CPU数量:2个 CPU线程数:32个 内存:128GB 磁盘...

GordonNemo
2018/11/13
972
0
HIVE高级与企业优化

HiveServer2 参考地址:http://blog.csdn.net/czw698/article/details/44394923 1、启动hiveserver2服务 $HIVE_HOME/bin/hive --service hiveserver2 2、测试连接是否以连上 不用写jdbc程序,......

qi49125
2017/11/14
0
0
Hadoop学习笔记:数据分析引擎Hive

概述 Hive是一个构建在Hadoop之上的数据仓库,和传统的数据仓库一样主要用来访问和管理数据,提供了类SQL查询语言;和传统数据仓库不一样的是可以处理超大规模的数据,可扩展性和容错性非常强...

GaryBigPig
01/16
0
0
Hive 随谈(三)– Hive 和数据库的异同

摘要:由于 Hive 采用了 SQL 的查询语言 HQL,因此很容易将 Hive 理解为数据库。其实 从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。本文将 从多个方面来阐述 Hive 和数...

红薯
2010/04/13
3.9K
1

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud 笔记之Spring cloud config client

观察者模式它的数据的变化是被动的。 观察者模式在java中的实现: package com.hxq.springcloud.springcloudconfigclient;import org.springframework.context.ApplicationListener;i...

xiaoxiao_go
50分钟前
4
0
CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
今天
4
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
7
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部