在mapper的单个输出上运行多个reducer

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

我正在使用map reduce实现左连接功能。左边有6亿张唱片,右边有2300万张唱片。在mapper中,我使用left join条件中使用的列生成键,并将mapper输出的键值传递给reducer。我遇到性能问题是因为Map器键太少,两个表中的值数量都很高(例如分别为456789和78960)。即使其他减速机完成了它们的工作,这些减速机仍能保持较长的运行时间。有没有什么方法可以让多个reducer并行处理mapper的同一个键值输出,从而提高性能?
这是我要优化的配置单元查询。

select distinct 
        a.sequence, 
        a.fr_nbr, 
        b.to_nbr, 
        a.fr_radius,
        a.fr_zip, 
        a.latitude as fr_latitude, 
        a.longitude as fr_longitude, 
        a.to_zip, 
        b.latitude as to_latitude, 
        b.longitude as to_longitude,
        ((2 * asin( sqrt( cos(radians(a.latitude)) * cos(radians(b.latitude)) * pow(sin(radians((a.longitude - b.longitude)/2)), 2) + pow(sin(radians((a.latitude - b.latitude)/2)), 2) ) )) * 6371 * 0.621371) as distance,
        a.load_year, 
        a.load_month
from common.sb_p1 a LEFT JOIN common.sb__temp0u b    
        on a.to_zip=b.zip
            and a.load_year=b.load_year
            and a.load_month=b.load_month
where   b.correction = 0 
        and a.fr_nbr <> b.to_nbr 
        and ((2 * asin( sqrt( cos(radians(a.latitude)) * cos(radians(b.latitude)) * pow(sin(radians((a.longitude - b.longitude)/2)), 2) + pow(sin(radians((a.latitude - b.latitude)/2)), 2) ) )) * 6371 * 0.621371 <= a.fr_radius)

任何其他解决方案也将不胜感激。

wljmcqd8

wljmcqd81#

您还可以考虑为此使用hiveql。它非常适用于像您上面提到的那种情况,并考虑map reduce实现的复杂性。

9o685dep

9o685dep2#

使用拆分倾斜的关键点 UNION ALL :

select * from table1 a left join table2 b on a.key=b.key
where a.key not in (456789,78960)
union all
select * from table1 a left join table2 b on a.key=b.key
where a.key = 456789
union all
select * from table1 a left join table2 b on a.key=b.key
where a.key = 78960
;

这些子查询将并行运行,歪斜的键不会分布到单个减速机

相关问题