#hadoop #mapreduce #reduce #hadoop2 #mapper
#hadoop #mapreduce #уменьшить #hadoop2 #mapper
Вопрос:
Я реализую функциональность соединения слева, используя map reduce. На левой стороне около 600 миллионов записей, а на правой — около 23 миллионов записей. В mapper я создаю ключи, используя столбцы, используемые в условии левого соединения, и передаю вывод ключ-значение из mapper в reducer. У меня возникают проблемы с производительностью из-за нескольких ключей mapper, для которых количество значений в обеих таблицах велико (например, 456789 и 78960 соответственно). Несмотря на то, что другие редукторы завершают свою работу, эти редукторы продолжают работать дольше. Есть ли какой-либо способ, которым несколько редукторов могут параллельно работать с одним и тем же выводом ключа-значения из 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)
Также будет оценено любое другое решение.
Комментарии:
1. Какой тип соединения вы выполняете? На стороне карты (реплицируется) или на стороне сокращения (перераспределение)?
2. Если вы знаете свои ключи, вы можете написать пользовательский раздел для повышения производительности. Exp: если ключ. значение<78960 …. еще …. tutorialspoint.com/map_reduce/map_reduce_partitioner.htm
3. @Nicomak Я использую reduce side join.
Ответ №1:
Разделите перекошенные ключи, используя 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
;
Эти подзапросы будут выполняться параллельно, искаженные ключи не будут распределены по одному редуктору
Ответ №2:
Вы также можете рассмотреть возможность использования HiveQL для этого. Это в значительной степени предназначено для ситуаций, подобных той, которую вы упомянули выше, и учитывает сложность реализации map reduce.
Комментарии:
1. В настоящее время я использую HiveQL, и для его завершения требуется от 48 до 50 часов. Вот почему я хотел попробовать это в пользовательской программе сокращения карты.