我在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;
我增加了减速器的数量,但它仍然不起作用。
答案 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的方式。尝试使用下面的设置,看看它是否适合您。
答案 2 :(得分:2)
如果您的查询卡在99%,请查看以下选项 -
答案 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.cate
和bt.ident
是否为null来拆分左表,稍后再将两者都做成bt.cate
分支机构:
union all