2016-10-17 1 views
1

Je suis en train d'implémenter une fonctionnalité de jointure à gauche en utilisant map reduce. Le côté gauche compte environ 600 millions de disques et le côté droit compte environ 23 millions de disques. Dans le mappeur, je crée les clés en utilisant les colonnes utilisées dans la condition de jointure gauche et en transmettant la sortie de valeur-clé du mappeur au réducteur. Je rencontre un problème de performances en raison du peu de clés de mappage pour lesquelles le nombre de valeurs dans les deux tables est élevé (par exemple, 456789 et 78960 respectivement). Même si d'autres réducteurs finissent leur travail, ces réducteurs continuent à fonctionner pendant plus longtemps. Est-il possible que plusieurs réducteurs puissent fonctionner sur la même sortie de valeur-clé à partir de mapper en parallèle pour améliorer les performances?Exécuter plusieurs réducteurs sur une sortie unique à partir du mappeur

Il s'agit de la requête Hive que je souhaite optimiser.

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) 

Toute autre solution sera également appréciée.

+0

Quel type de se joindre à vous faites? Côté carte (répliqué) ou côté réduit (répartition)? – Nicomak

+0

Si vous connaissez vos clés, vous pouvez écrire une partition personnalisée pour de meilleures performances. Exp: Si key.value <78960 .... autre .... https://www.tutorialspoint.com/map_reduce/map_reduce_partitioner.htm – pckmn

+0

@Nicomak J'utilise réduire la jointure latérale. –

Répondre

0

Vous pouvez également utiliser HiveQL pour cela. Son à peu près destiné à des situations comme celle que vous avez mentionné ci-dessus et prend en charge la complexité de la carte de réduire la mise en œuvre.

+0

Actuellement, j'utilise HiveQL et il faut environ 48 à 50 heures pour terminer. C'est la raison pour laquelle je voulais l'essayer dans le programme Custom Reduce. –

1

diviser les clés asymétriques à l'aide 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 
; 

Ces sous-requêtes se dérouleront en parallèle, les clés asymétriques ne seront pas distribués au seul réducteur