hive查询不断失败如何最佳地连接非常大的表?

xesrikrc  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(294)

我正在尝试(内部)连接hdfs上按“day”(日期)分区的两个表,并持续了多天(比如2周)。两个表都有100个列,但我只想查询其中的10个。每天有超过十亿行。
我的配置单元查询如下所示。

INSERT OVERWRITE TABLE join1 partition (day) 
SELECT a.x1, a.x2, a.x3... a.xn, b.y1, b.y2.... b.ym, b.day 
from (
    select x1, x2, x3... xn 
    from table1 
    where day between day1 and day2
) a 
join (
    select x1, y1, y2,... ym, day 
    from table2 where day between day1 and day2
) b 
on a.x1=b.x1;

第一个问题-这需要一个真正的长时间(12+小时)这样做,即使在较小的时间(1-7天)加入。
第二个问题-每次我试着做超过10天左右都会失败。它使用大约504个Map器和250个还原器,这是默认值(我也尝试过500个还原器)。

我知道这个错误不是真的(hive是什么:从org.apache.hadoop.hive.ql.exec.mapredtask返回代码2),但是即使是真正的错误也不是很有用(很抱歉,我现在不能得到它)。
这次撞车的原因是什么?有谁能建议一个更好的方法加入这么大的表?

j5fpnvbx

j5fpnvbx1#

关于错误:
既然您在join1上使用动态分区,那么您是否正确设置了可以创建的最大分区数?
关于速度:
你的表1和表2是这样定义的吗?

CREATE table1 ( 
  x1 string,
  x2 string,
  :
) PARTITIONED BY ( day int ) 
CLUSTERED BY ( 'x1' ) 
SORTED BY ( x1 ) INTO 400 BUCKETS;

这个表是按天分区的,因此访问任何一天都只需要访问相应的分区,而不需要访问整个文件。这将加速你的内部查询。它还使用bucketing,因此当您在x1上执行连接时,所有具有相同x1值的行都被粘贴在同一个位置,这将加快您的连接速度,不要介意这样大的增量。只有在Map阶段进行连接(由于bucketing),差异才可见。

ryoqjall

ryoqjall2#

这太长了,不能发表评论。
一些数据库在优化子查询时出现问题。我可以想象这是Hive的问题。因此,我建议:

select a.x1, a.x2, a.x3... a.xn, b.y1, b.y2.... b.ym, b.day 
from table1 a join
     table2 b 
     on a.x1 = b.x1
where a.day between a.day1 and a.day2 and
      b.day between b.day1 and b.day2;

我还想知道你是否想要一个条件 a.day = b.dayon 条款。在连接中使用现有的分区键应该有助于提高性能。

相关问题