Sql 配置单元查询停留在99%

Sql 配置单元查询停留在99%,sql,hadoop,hive,mapreduce,hiveql,Sql,Hadoop,Hive,Mapreduce,Hiveql,我在配置单元中使用左连接插入记录。当我设置限制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

我在配置单元中使用左连接插入记录。当我设置限制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;

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

Hive在连接时会自动进行一些优化,并在符合要求的情况下将连接的一侧加载到内存中。然而,在某些情况下,这些工作停留在99%的水平,永远不会真正完成

我已经多次面对这个问题,我通过明确地为配置单元指定一些设置来避免这个问题。尝试下面的设置,看看它是否适合您

  • hive.auto.convert.join=false
  • mapred.compress.map.output=true
  • hive.exec.parallel=true

  • 下面是一些配置单元优化,这些优化可能有助于查询优化器并减少通过网络发送数据的开销

    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;
    
    然而,我认为潜在的问题很可能是连接中的关键。有关歪斜和可能的解决方法的完整描述,请参见


    您还提到表1比表2小得多。根据硬件限制,您可以尝试地图侧连接。()

    使用这些配置并尝试
    hive>设置mapreduce.map.memory.mb=9000;
    配置单元>设置mapreduce.map.java.opts=-xmx720m;
    配置单元>设置mapreduce.reduce.memory.mb=9000;
    
    配置单元>设置mapreduce.reduce.java.opts=-xmx720m

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

    • 数据偏斜,如果您有偏斜的数据,那么可能1个reducer正在做所有的工作
    • 在两侧重复键-如果在两侧都有许多重复的连接键,则输出可能会爆炸,查询可能会卡住
    • 您的表中有一个很小,请尝试使用映射连接或SMB连接(如果可能的话),这比reduce-side连接有巨大的性能提升
    • 转到资源管理器日志,查看作业正在访问和写入的数据量
    我遇到了与左外连接相同的问题,类似于:

    select bt.*, sm.newparam from
    big_table bt
    left outer join
    small_table st
    on bt.ident = sm.ident 
    and bt.cate - sm.cate
    
    我根据已经给出的答案进行了分析,发现了两个问题:

    左桌子比右桌子大100倍多

    select count(*) from big_table   -- returned 130M
    select count(*) from small_table -- returned 1.3M
    
    我还检测到右表中的一个join变量有点倾斜:

    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
    bt.cate
    是否为空来拆分左表,以便稍后使用两个分支创建一个
    union all

    select * from
    (select bt.*, sm.newparam from
    select * from big_table bt where ident is not null or cate is not null
    left outer join
    small_table st
    on bt.ident = sm.ident 
    and bt.cate - sm.cate
        union all
    select *, null as newparam from big_table nbt where ident is null and cate is null) combined
    

    确保其中一个数据表中没有id值重复的行

    我最近遇到了同样的问题,一个左连接的map reduce进程在色调上被卡住了99%


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

    转到Hadoop jobtracker web dashboard,查找失败的mapreduce作业。这可能会给你更多的细节。数据的大小是多少。?检查rsourcemanager/jobtracker UI并检查作业详细信息。查看此作业生成了多少任务,有多少成功,有多少失败,失败原因等。Amar我尝试了所有设置。但仍然查询被卡在99%。你能分享一下两个表中的数据量吗?表1有36.4 MB,表2有204 MB。我尝试了限制为1000的查询,结果成功了。但没有限制,它只是被卡住了。你的一个表很小:如何描述小。1:100还是1:1000还是1:10000?