我正在使用HDP 2.6.4,并且看到了Spark SQL与TeZ上的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
AM资源:4096 MB
通过Snappy使用tez.runtime.compress
数据为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
启用矢量化和地图矢量化为真
启用缩小矢量化错误
hive.vectorized.groupby.checkinterval 4096
hive.vectorized.groupby.flush.percent 0.1
hive.tez.container.size 682
更多更新:
[在此link上进行矢量化检查时,我注意到当我使用explain
时在任何地方都没有看到矢量化执行:true。引起我注意的另一件事是: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之间的任何比较通常都使用相对相同的术语,但是我看到了巨大的差异。
首先要检查什么?
Thx
最后,我们放弃并安装了LLAP。我将接受它作为答案,因为我有点强迫症,而这个悬而未决的问题已经引起我足够长的关注。