2

我正在使用 HDP 2.6.4,并且在 TeZ 上看到 Spark SQL 与 Hive 的巨大差异。这是对约 95 M 行表的简单查询

SELECT DT, Sum(1) from mydata GROUP BY DT

DT是分区列,一个标记日期的字符串。

在 spark shell 中,有 15 个执行器,10G 内存用于驱动程序,15G 用于执行器,查询运行 10-15 秒。

在 Hive 上运行时(来自beeline),查询运行(实际上仍在运行)500 多秒。(!!!) 更糟糕的是,这个应用程序比我运行该工作的 spark shell 会话占用更多的资源(显着)。

更新:它完成了1 row selected (672.152 seconds)

有关环境的更多信息:

  • 仅使用一个队列,带有容量调度程序

  • 运行作业的用户是我自己的用户。我们将 Kerberos 与 LDAP 一起使用

  • 上午资源:4096 MB

  • 将 tez.runtime.compress 与 Snappy 一起使用

  • 数据为 Parquet 格式,未应用压缩

  • tez.task.resource.memory 6134 MB

  • tez.counters.max 10000

  • tez.counters.max.groups 3000

  • tez.runtime.io.sort.mb 8110 MB

  • tez.runtime.pipelined.sorter.sort.threads 2

  • tez.runtime.shuffle.fetch.buffer.percent 0.6

  • tez.runtime.shuffle.memory.limit.percent 0.25

  • tez.runtime.unordered.output.buffer.size-mb 460 MB

  • 启用矢量化和地图矢量化 true

  • 启用减少矢量化 false

  • hive.vectorized.groupby.checkinterval 4096

  • hive.vectorized.groupby.flush.percent 0.1

  • hive.tez.container.size 682

更多更新:

在此链接上检查矢量化时,我注意到我没有看到Vectorized execution: true当我使用explain. 引起我注意的另一件事是:table:{"input format:":"org.apache.hadoop.mapred.TextInputFormat","output format:":"org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat","serde:":"org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe"}

即,在检查表本身时:STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'

spark和tez之间的任何比较通常都是相对相同的,但我看到了巨大的差异。

首先要检查什么?

谢谢

4

1 回答 1

0

最后,我们放弃并安装了 LLAP。我会接受它作为答案,因为我有一种强迫症,这个未回答的问题已经戳了我的眼睛足够长的时间了。

于 2020-04-07T10:28:29.733 回答