Hive查询停留在99%

时间:2015-07-21 02:28:48

标签: sql hadoop hive mapreduce hiveql

我在Hive中使用左连接插入记录。当我设置限制1查询时,但是对于所有记录查询都会停留在99%减少作业。

以下查询工作

   Insert overwrite table tablename select a.id , b.name from a left join b on a.id = b.id limit 1; 

但这不是

    Insert overwrite table tablename select table1.id , table2.name from table1 left join table2 on table1.id = table2.id;

我增加了减速器的数量,但它仍然不起作用。

6 个答案:

答案 0 :(得分:4)

以下是一些Hive优化,可以帮助查询优化器并减少通过线路发送的数据的开销。

set hive.exec.parallel=true;
set mapred.compress.map.output=true;
set mapred.output.compress=true;
set hive.exec.compress.output=true;
set hive.exec.parallel=true;
set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true;

但是,我认为基础问题更有可能成为加入的关键。有关偏斜和可能的解决方法的完整描述,请参阅此https://cwiki.apache.org/confluence/display/Hive/Skewed+Join+Optimization

您还提到table1比table2小得多。您可以尝试根据硬件限制进行地图侧连接。 (https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

答案 1 :(得分:3)

Hive会在连接时自动执行一些优化,并在符合要求的情况下将连接的一端加载到内存中。然而,在某些情况下,这些工作被困在99%而且从未真正完成。

我已经多次面对这种情况以及通过明确指定一些设置来实现hive的方式。尝试使用下面的设置,看看它是否适合您。

  1. hive.auto.convert.join = false
  2. mapred.compress.map.output =真
  3. hive.exec.parallel =真

答案 2 :(得分:2)

如果您的查询卡在99%,请查看以下选项 -

  • 数据偏斜,如果你有数据偏斜,1 reducer正在做所有的工作
  • 双方都复制密钥 - 如果双方都有许多重复的连接密钥,那么您的输出可能会爆炸并且查询可能会卡住
  • 你的一张桌子很小,尝试使用地图连接,或者如果可能的话,SMB连接比减少连接加入是一个巨大的性能提升
  • 转到资源管理器日志,查看正在访问和写入的数据量。

答案 3 :(得分:1)

确保您的数据表之一中没有具有重复 id 值的行!

我最近遇到了同样的问题,即左连接的 map-reduce 进程在 Hue 中卡住了 99%。

经过一番窥探后,我发现了问题的根源:在我的一个表中存在具有重复的 member_id 匹配变量的行。加入所有重复的 member_ids 会创建一个包含数亿行的新表,消耗的内存超过我在我们公司的 Hadoop 服务器上分配的内存。

答案 4 :(得分:0)

使用这些配置并尝试 hive> set mapreduce.map.memory.mb=9000; hive> set mapreduce.map.java.opts=-Xmx7200m; hive> set mapreduce.reduce.memory.mb=9000; hive> set mapreduce.reduce.java.opts=-Xmx7200m

答案 5 :(得分:0)

我遇到了与左外连接类似的相同问题:

location

我根据已经给出的答案进行了分析,发现了其中两个问题:

左桌比右桌大100倍以上

select bt.*, sm.newparam from
big_table bt
left outer join
small_table st
on bt.ident = sm.ident 
and bt.cate - sm.cate

我还检测到右表中的连接变量之一偏斜:

select count(*) from big_table   -- returned 130M
select count(*) from small_table -- returned 1.3M

我尝试了其他答案中给出的大多数解决方案,以及我发现的here某些额外参数,但均未成功。

select count(*), cate 
from small_table 
group by cate 

-- returned
-- A    70K
-- B   1.1M
-- C   120K

最后我发现左表的连接列的空值的百分比非常高set hive.optimize.skewjoin=true; set hive.skewjoin.key=500000; set hive.skewjoin.mapjoin.map.tasks=10000; set hive.skewjoin.mapjoin.min.split=33554432; bt.ident

所以我尝试了最后一件事,最后对我有用:取决于bt.catebt.ident是否为null来拆分左表,稍后再将两者都做成bt.cate分支机构:

union all