我决定使用parquet作为配置单元表的存储格式,在集群中实际实现它之前,我决定运行一些测试。令人惊讶的是,在我的测试中,parquet的速度比一般认为的要快的纯文本文件慢。
请注意,我正在mapr上使用hive-0.13
----------------------------------------------------------
| | Table A | Table B | Table C | |
----------------------------------------------------------
| Format | Text | Parquet | Parquet | |
| Size[Gb] | 2.5 | 1.9 | 1.9 | |
| Comrepssion | N/A | N/A | Snappy | |
| CPU [sec] | 123.33 | 204.92 | N/A | Operation1 |
| Time [sec] | 59.057 | 50.33 | N/A | Operation1 |
| CPU [sec] | 51.18 | 117.08 | N/A | Operation2 |
| Time [sec] | 25.296 | 27.448 | N/A | Operation2 |
| CPU [sec] | 57.55 | 113.97 | N/A | Operation3 |
| Time [sec] | 20.254 | 27.678 | N/A | Operation3 |
| CPU [sec] | 57.55 | 113.97 | N/A | Operation4 |
| Time [sec] | 20.254 | 27.678 | N/A | Operation4 |
| CPU [sec] | 127.85 | 255.2 | N/A | Operation5 |
| Time [sec] | 29.68 | 41.025 | N/A | Operation5 |
操作1:行计数操作
操作2:单行选择
操作3:使用where子句进行多行选择[获取1000行]
操作4:使用where子句[获取1000行]进行多行选择[只有4列]
operation5:聚合操作[对给定列使用sum函数]
您可以看到,在我对这两个表应用的几乎所有操作中,parquet在执行查询所用的时间方面都落后于row count操作。
我也使用了表c来执行上述操作,但是结果几乎都在类似的行中,textfile格式再次成为这两种格式中的snappier。
有人能告诉我我做错了什么吗?
谢谢!
编辑
我将orc添加到存储格式列表中,然后再次运行测试。遵循细节。
行计数操作
文本格式累计cpu-123.33秒
Parquet格式累计cpu-204.92秒
orc格式累计cpu-119.99秒
具有快速累积cpu的orc-107.05秒
列操作的和
文本格式累计cpu-127.85秒
Parquet格式累计cpu-255.2秒
orc格式累计cpu-120.48秒
具有快速累积cpu的orc-98.27秒
列操作的平均值
文本格式累计cpu-128.79秒
Parquet格式累计cpu-211.73秒
orc格式累计cpu-165.5秒
具有快速累积cpu的orc-135.45秒
使用where子句从给定范围中选择4列
文本格式累计cpu-72.48秒
Parquet格式累计cpu-136.4秒
orc格式累计cpu-96.63秒
具有快速累积cpu的orc-82.05秒
这是否意味着兽人比Parquet更快?或者我可以做些什么来提高查询响应时间和压缩比?
谢谢!
1条答案
按热度按时间inb24sb21#
首先,我想指出的是,用给定的细节回答你的问题几乎是不可能的。
几点:
在分布式环境中测量时间并不是确定某个东西是否慢的方法(如果您有许多查询正在运行并且正在争夺资源,那么您并不是在测量您认为正在测量的东西)
不提供实际的表定义和针对这些表运行的查询使得这个问题无法重现
不提供表的行数及其各个字段的基数也无济于事
一般来说,查询parquet要比查询文本文件快得多,因为parquet使用了许多东西来加快读取操作。这些东西很少:
压缩
游程编码
字典编码
根据用例的不同,一些东西的参数可以调整到准确的用例。