2016-10-17 7 views
1

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

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

+0

Какой тип соединения вы делаете? Сопоставление карт (копирование) или сокращение (перераспределение)? – Nicomak

+0

Если вы знаете свои ключи, вы можете написать собственный раздел для лучшей производительности. Exp: Если key.value <78960 .... else .... https://www.tutorialspoint.com/map_reduce/map_reduce_partitioner.htm – pckmn

+0

@Nicomak Я использую сокращение бокового соединения. –

ответ

0

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

+0

В настоящее время я использую HiveQL и занимает от 48 до 50 часов времени. Вот почему я хотел попробовать его в пользовательской программе «Уменьшить карту». –

1

Split перекос клавиши с помощью 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 
; 

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