为什么镶木地板对我而言对于hive中的文本文件格式较慢?

Rah*_*hul 5 hadoop hive mapr snappy parquet

好!所以我决定使用Parquet作为hive表的存储格式,在我实际在集群中实现之前,我决定运行一些测试.令人惊讶的是,Parquet在我的测试中速度较慢,因为它比普通文本文件更快.

请注意,我在MapR上使用Hive-0.13

遵循我的操作流程

表A.

格式 - 文本格式

表大小 - 2.5 Gb

表B.

格式 - 镶木地板

表大小 - 1.9 Gb

[创建表格B作为选择*从A存储为镶木地板]

表C.

格式 - 带有快速压缩的镶木地板

表大小 - 1.9 Gb

[创建表格C存储为镶木地板tblproperties("parquet.compression"="SNAPPY")作为select*from A]

现在我对上面提到的表进行了一些测试并遵循了细节.

  • 行计数操作

表A.

地图 - 15

减少 - 1

累积CPU - 123.33秒

所需时间 - 59.057秒

表B.

地图 - 8

减少 - 1

累计CPU - 204.92秒

所需时间 - 50.33秒

  • 单行选择

表A.

地图 - 15

减少 - 0

累计CPU - 51.18秒

所需时间 - 25.296秒

表B.

地图 - 8

减少 - 0

累计CPU - 117.08秒

所需时间 - 27.448秒

  • 使用Where子句的多行选择[已提取1000行]

表A.

地图 - 15

减少 - 0

累积CPU - 57.55秒

所需时间 - 20.254秒

表B.

地图 - 8

减少 - 0

累积CPU - 113.97秒

所需时间 - 27.678秒

  • 多行选择[仅有4列]使用Where子句[1000行已获取]

表A.

地图 - 15

减少 - 0

累积CPU - 57.55秒

所需时间 - 20.254秒

表B.

地图 - 8

减少 - 0

累积CPU - 113.97秒

所需时间 - 27.678秒

  • 聚合操作[在给定列上使用求和函数]

表A.

地图 - 15

减少 - 1

累积CPU - 127.85秒

所需时间 - 29.68秒

表B.

地图 - 8

减少 - 1

累积CPU - 255.2秒

所需时间 - 41.025秒

您可以看到,在我在两个表上应用的几乎所有操作中,Parquet在执行查询所花费的时间方面落后,但行计数操作除外.

我还使用表C来执行上述操作,但结果几乎在类似的行上,TextFile格式再次是两者的快捷方式.

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

谢谢!

编辑

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

行计数操作

文本格式累积CPU - 123.33秒

实木复合地板格式累计CPU - 204.92秒

ORC格式累积CPU - 119.99秒

ORC与SNAPPY累计CPU - 107.05秒

列操作的总和

文本格式累积CPU - 127.85秒

木地板格式累积CPU - 255.2秒

ORC格式累积CPU - 120.48秒

ORC与SNAPPY累积CPU - 98.27秒

列操作的平均值

文本格式累积CPU - 128.79秒

木地板格式累积CPU - 211.73秒

ORC格式累积CPU - 165.5秒

ORC与SNAPPY累积CPU - 135.45秒

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

文本格式累积CPU - 72.48秒

实木复合地板格式累计CPU - 136.4秒

ORC格式累积CPU - 96.63秒

ORC与SNAPPY累积CPU - 82.05秒

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

谢谢!

Ist*_*van 0

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

几点:

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

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

  • 不提供表的行数及其各个字段的基数也没有帮助

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

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

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