Запуск нескольких редукторов на одном выходе из mapper

#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 часов. Вот почему я хотел попробовать это в пользовательской программе сокращения карты.