2013-04-26 6 views
0

Pour des raisons d'équilibrage de charge, je souhaite créer plus de partitions que de réducteurs dans un environnement Hadoop. Est-il possible d'attribuer des partitions à des réducteurs spécifiques et, si oui, où puis-je les définir? J'ai écrit un Partitioner individuel et je veux maintenant adresser un réducteur spécifique avec des partitions spécifiques.hadoop distribuer les partitions au réducteur

Merci d'avance pour l'aide!

Répondre

0

Hadoop ne se prête pas à ce type de contrôle.

comme expliqué par la page 43-44 de this excellent livre. Le programmateur a peu de contrôle sur:

  1. Lorsqu'un mappeur ou un réducteur s'exécute (c'est-à-dire, sur quel nœud de la grappe).
  2. Lorsqu'un mappeur ou un réducteur commence ou finit.
  3. Quelles paires clé-valeur d'entrée sont traitées par un mappeur spécifique.
  4. Quelles paires clé-valeur intermédiaires sont traitées par un réducteur spécifique. (ce que vous voulez)

MAIS

Vous pouvez changer le numéro 4 en mettant en place un intelligemment conçu Partitioner personnalisé qui divise vos données juste la façon dont vous voulez en sorte que et distribue votre charge sur les réducteurs comme attendu. Découvrez comment ils implémentent un partitionneur personnalisé pour calculer les fréquences relatives dans le chapitre 3.3.

+0

merci beaucoup pour votre réponse. Est-il donc correct que je ne puisse pas analyser les données pendant la fonction map et après que tous les mappeurs aient terminé, calculez la distribution des données et distribuez-les ensuite avec un partitionneur individuel, qui est juste construit après toutes les fonctions de la carte sont effectuées et la distribution spécifique (en fonction de l'entrée) de mes données. – beto8888

+0

Malheureusement, Hadoop n'autorise pas ce type de contrôle. Il y aura peut-être quelque chose dans les prochains travaux sur Hadoop YARN et MR2, car il s'agit d'une refonte majeure, mais je ne suis pas au courant de cela aujourd'hui. Si j'ai répondu à la question à votre satisfaction, veuillez accepter ma réponse. – Engineiro

+0

user2323063, en fait, vous pouvez échantillonner vos données en exécutant des cartes sur des portions de données, puis placer des divisions calculées sur le cache distribué. comment cela peut être fait, vous pouvez voir dans TeraSort imlementation http://hadoop.apache.org/docs/current/api/org/apache/hadoop/examples/terasort/package-summary.html – octo

0

Le portionnement est effectué pour les réducteurs. Autant de partitions sont créées que le nombre de réducteurs choisis. Vous pouvez choisir le nombre de réducteurs par

job.setNumReduceTasks(n); 

Le nombre n ne doit pas être limité par le nombre de réducteur physique que vous avez. Il y aura seulement un peu d'attente pour obtenir la prochaine fente de réduction. Dans votre code de partition, vous pouvez implémenter la logique requise pour affecter une clé à une partition spécifique.

Cependant, je ne vois pas d'efficacité en dépassant le nombre d'emplacements de réducteurs physiquement disponibles, car cela ne fera qu'attendre l'emplacement de réduction suivant.

+0

Nous vous remercions de votre aide. L'objectif de créer plus de partitions que de réducteurs est, pour calculer la taille des partitions individuelles, et de donner à un réducteur plus d'une partition pour donner à tous les réducteurs le même travail – beto8888

Questions connexes