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

Я реализую функцию левого соединения, используя уменьшение карты. Левая сторона содержит около 600 миллионов записей, а правая - около 23 миллионов записей. В картографе я делаю ключи, используя столбцы, используемые в условии левого соединения, и передаю вывод значения ключа из преобразователя в редуктор. У меня проблемы с производительностью из-за нескольких ключей сопоставления, для которых количество значений в обеих таблицах велико (например, 456789 и 78960 соответственно). Несмотря на то, что другие редукторы завершают свою работу, эти редукторы продолжают работать дольше. Есть ли способ, которым несколько редукторов могут работать с одним и тем же выводом ключевого значения из сопоставителя параллельно для повышения производительности?

Это запрос 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)

Любое другое решение также будет оценено по достоинству.


person Sumit Bharati    schedule 17.10.2016    source источник
comment
Какой тип присоединения вы делаете? Сторона карты (репликация) или сторона сокращения (повторное разбиение)?   -  person Nicomak    schedule 18.10.2016
comment
Если вы знаете свои ключи, вы можете написать собственный раздел для повышения производительности. Exp: Если key.value ‹78960 .... else .... tutorialspoint.com/map_reduce /map_reduce_partitioner.htm   -  person pckmn    schedule 18.10.2016
comment
@Nicomak Я использую сокращение бокового соединения.   -  person Sumit Bharati    schedule 18.10.2016


Ответы (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
;

Эти подзапросы будут выполняться параллельно, перекошенные ключи не будут переданы одному редуктору.

person leftjoin    schedule 18.10.2016

Вы также можете рассмотреть возможность использования для этого HiveQL. Это в значительной степени предназначено для ситуаций, подобных той, которую вы упомянули выше, и заботится о сложности реализации уменьшения карты.

person Pushkin    schedule 18.10.2016
comment
В настоящее время я использую HiveQL, и на его завершение уходит от 48 до 50 часов. Это была причина, по которой я хотел попробовать это в специальной программе Map Reduce. - person Sumit Bharati; 18.10.2016