ORC和Parquet的一些简单对比

一、简介

目前我们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 129 13:39 customer.tbl
-rw-r--r-- 1 root root 1532344491 129 13:39 lineitem.tbl
-rw-r--r-- 1 root root       2224 129 13:39 nation.tbl
-rw-r--r-- 1 root root  345760490 129 13:39 orders.tbl
-rw-r--r-- 1 root root  239178674 129 13:39 partsupp.tbl
-rw-r--r-- 1 root root   48380536 129 13:39 part.tbl
-rw-r--r-- 1 root root        389 129 13:39 region.tbl
-rw-r--r-- 1 root root    2826802 129 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


版权声明:本文为zhangs_123原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。