我正在使用 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之间的任何比较通常都是相对相同的,但我看到了巨大的差异。
首先要检查什么?
谢谢