在映射器的单个输出上运行多个减速器
Posted
技术标签:
【中文标题】在映射器的单个输出上运行多个减速器【英文标题】:Run multiple reducers on single output from mapper 【发布时间】:2017-02-26 22:50:33 【问题描述】:我正在使用 map reduce 实现左连接功能。左侧有大约 6 亿条记录,右侧有大约 2300 万条记录。在映射器中,我使用左连接条件中使用的列来制作键,并将键值输出从映射器传递到减速器。 我遇到了性能问题,因为两个表中的值数量都很高(例如分别为 456789 和 78960)的映射器键很少。即使其他减速器完成了他们的工作,这些减速器也会继续运行更长的时间。 有什么方法可以让多个 reducer 并行处理 mapper 的相同键值输出以提高性能?
这是我要优化的 Hive 查询。
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)
任何其他解决方案也将不胜感激。
【问题讨论】:
你在做什么类型的加入? Map-side (replicated) or reduce-side (repartition) ? 如果您知道您的密钥,您可以编写自定义分区以获得更好的性能。 Exp: If key.valuetutorialspoint.com/map_reduce/map_reduce_partitioner.htm @Nicomak 我正在使用reduce side join。 【参考方案1】:您也可以考虑为此使用 HiveQL。它几乎适用于您上面提到的那种情况,并处理 map reduce 实现的复杂性。
【讨论】:
目前我正在使用 HiveQL,它需要大约 48 到 50 小时才能完成。这就是我想在自定义 Map Reduce 程序中尝试它的原因。【参考方案2】:使用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
;
这些子查询将并行运行,倾斜的键不会分配给单个 reducer
【讨论】:
以上是关于在映射器的单个输出上运行多个减速器的主要内容,如果未能解决你的问题,请参考以下文章
3.2Adding custom methods to mappers(在映射器中添加自定义方法)