目录
一、简介
目前我们Hive数仓建表存储格式主要是Parquet+默认压缩,因为Parquet默认压缩是UNCOMPRESSED,大部分场景数据都是很少压缩的,所以对Hive常用的存储格式和压缩算法做了一下测试。
Hive支持的几种文件格式有: TextFile(文本格式),RCFile(行列式文件),SequenceFile(二进制序列化文件),AVRO,ORC(优化的行列式文件)和Parquet 格式,其中使用最多的是ORC和Parquet。下面主要是ORC和Parquet的对比。
1.1 ORC
列式存储
提供了多种索引,可以支持复杂的数据结构
ORC格式的表还支持事务ACID
ORC 的Hive关键配置
ORC 与 Hive 接触的比较紧密,在CDH 6.1.x 版本即 Impala3.x 开始以 experimental feature 支持 ORC 格式
KEY DEFAULT NOTES
orc.compress ZLIB compression = {NONE, ZLIB, SNAPPY}
ORC文件的压缩类型,可选的类型有NONE、ZLIB和SNAPPY,默认值是ZLIB
1.2 Parquet
列式存储
在Hadoop生态圈使用范围广,Hive、Impala、Presto 等各种查询引擎
对Impala支持更好
KEY DEFAULT NOTES
orc.compress UNCOMPRESSED compression = {UNCOMPRESSED, GZIP, SNAPPY}
parquet.compression:默认值为 UNCOMPRESSED,表示页的压缩方式。可以使用的压缩方式有 UNCOMPRESSED、 SNAPPY、GZIP 等。
二、测试环境说明
2.1.集群环境
CDH6.1.0,Hive 2.1.1,impala 3.4.0,集群节点6
cdh-datanode1
cdh-datanode2
cdh-datanode3
cdh-datanode4
cdh-namenode1
cdh-namenode2
相同队列,测试条件相同,查询无并发
2.2 测试数据
测试数据为TPC-H测试数据集+测试环境自有数据集
2.2.1 TPC-H使用
是一系列事务处理和数据库基准测试的规范,TPC-H主要用于BI和决策支持
1)tpch下载
官网www.tpc.org/tpch/ 下载TPCH_Tools.zip
2)解压
unzip TPCH_Tools.zip
3)配置
cd /var/tpc-h/2.18.0_rc2/dbgen
cp makefile.suite makefile
vim makefile
################
## CHANGE NAME OF ANSI COMPILER HERE
################
CC = gcc
# Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
# SQLSERVER, SYBASE, ORACLE, VECTORWISE
# Current values for MACHINE are: ATT, DOS, HP, IBM, ICL, MVS,
# SGI, SUN, U2200, VMS, LINUX, WIN32
# Current values for WORKLOAD are: TPCH
DATABASE = SQLSERVER
MACHINE = LINUX
WORKLOAD = TPCH
数据库没有原生支持Hive,所以SQL Server,再修改一下源码,将其对应的语句改成Hive风格的。
~ vim tpcd.h
#ifdef SQLSERVER
#define GEN_QUERY_PLAN "explain;"
#define START_TRAN "start transaction;\n"
#define END_TRAN "commit;\n"
#define SET_OUTPUT ""
#define SET_ROWCOUNT "limit %d;\m"
#define SET_DBASE "use %s;\n"
#endif
4)生成执行命令,生成dbgen
make #生成dbgen
./dbgen -s 2 #生成1GB数据
最终会生成8个扩展名为.tbl的文件,代表8张表的数据,如下图所示。
-rw-r--r-- 1 root root 48803120 1月 29 13:39 customer.tbl
-rw-r--r-- 1 root root 1532344491 1月 29 13:39 lineitem.tbl
-rw-r--r-- 1 root root 2224 1月 29 13:39 nation.tbl
-rw-r--r-- 1 root root 345760490 1月 29 13:39 orders.tbl
-rw-r--r-- 1 root root 239178674 1月 29 13:39 partsupp.tbl
-rw-r--r-- 1 root root 48380536 1月 29 13:39 part.tbl
-rw-r--r-- 1 root root 389 1月 29 13:39 region.tbl
-rw-r--r-- 1 root root 2826802 1月 29 13:39 supplier.tbl
2.2.2 建表、sql和数据准备
1)建表语句见附件,分别建Textfile、ORC、Parquet表
2)导入数据
数据先load 到textfile表,然后再导入到orc和parquet表
3)查询语句见附件
三、Impala查询ORC和Parquet对比
TPC-H一共有22条基准SQL查询,已经有人改写成了Hive风格sql https://github.com/Maikiki/TPCH 。sql的具体分析可见文档 https://issues.apache.org/jira/browse/HIVE-600
下载其中的sql文件即可。
测试结果如下
结论:Impala查询Hive表为ORC和Parquet格式耗时差别不是很大,Parquet要快一点。
四、ORC和Parquet的压缩效率对比
ORC默认使用zlib压缩,Parquet默认未压缩,相同的数据源用相同的方式加载到对应表中,对比了几种常见的压缩格式,得到如下压缩数据。
结论:ORC:zlib>snappy
Parquet:gzip>snappy>uncompressed
zlib>gzip
五、ORC和Parquet的简单查询效率对比
查询引擎:Hive on Spark
结论:ORC:zlib>snappy
Parquet:gzip>snappy>uncompressed
zlib>gzip
六、总结
提供给Impala查询的Hive表可选择用ORC+zlib和Parquet+gzip,其余的表都建议用ORC+zlib(默认压缩)以提升各方面的性能。
附件
The End.
参看资料:
https://my.oschina.net/u/4598301/blog/4619280
https://orc.apache.org/docs/hive-config.html
https://www.jianshu.com/p/59155803d67b
https://zhuanlan.zhihu.com/p/409137842
https://issues.apache.org/jira/browse/HIVE-600