6

我决定使用 Parquet 作为 hive 表的存储格式,在我实际在集群中实现它之前,我决定运行一些测试。令人惊讶的是,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 |
  • Operation1:行计数操作
  • 操作2:单行选择
  • 操作 3:使用 Where 子句进行多行选择 [提取 1000 行]
  • 操作 4:多行选择 [只有 4 列] 使用 Where 子句 [提取 1000 行]
  • Operation5:聚合操作[在给定列上使用 sum 函数]

您可以看到,在我对这两个表应用的几乎所有操作中,Parquet 在执行查询所需的时间方面都落后了,但行计数操作除外。

我还使用表 C 来执行上述操作,但结果几乎与 TextFile 格式相似的行再次是两者中更快的。

有人可以让我知道我做错了什么吗?

谢谢!

编辑

我将 ORC 添加到存储格式列表中并再次运行测试。遵循细节。

行计数操作

文本格式累积 CPU - 123.33 秒

Parquet 格式累积 CPU - 204.92 秒

ORC 格式累积 CPU - 119.99 秒

具有 SNAPPY 累积 CPU 的 ORC - 107.05 秒

列操作的总和

文本格式累积 CPU - 127.85 秒

Parquet 格式累积 CPU - 255.2 秒

ORC 格式累积 CPU - 120.48 秒

具有 SNAPPY 累积 CPU 的 ORC - 98.27 秒

列操作的平均值

文本格式累积 CPU - 128.79 秒

Parquet 格式累积 CPU - 211.73 秒

ORC 格式累积 CPU - 165.5 秒

具有 SNAPPY 累积 CPU 的 ORC - 135.45 秒

使用 where 子句从给定范围中选择 4 列

文本格式累积 CPU - 72.48 秒

Parquet 格式累积 CPU - 136.4 秒

ORC 格式累积 CPU - 96.63 秒

具有 SNAPPY 累积 CPU 的 ORC - 82.05 秒

这是否意味着 ORC 比 Parquet 更快?或者我可以做些什么来使其在查询响应时间和压缩率方面更好地工作?

谢谢!

4

1 回答 1

0

首先我想指出的是,用给定的细节来回答你的问题几乎是不可能的。

几点:

  • 在分布式环境中测量时间并不是确定某事是否缓慢的方法(如果您有许多查询正在运行并争夺资源,那么您就没有测量您认为正在测量的内容)

  • 不提供实际的表定义和针对这些表运行的查询使这个问题无法重现

  • 不提供表的行数及其各个字段的基数也无济于事

一般来说,查询 Parquet 比查询文本文件要快得多,因为 Parquet 使用了很多东西来使读取操作更快。这些东西很少:

  • 压缩
  • 游程编码
  • 字典编码

根据用例,可以将事物的某些参数调整为确切的用例。

于 2020-11-16T14:08:48.793 回答