2015-09-17 4 views
0

Essaie de déterminer s'il y a certains hooks disponibles dans le hadoop api (hadoop 2.0.0 mrv1) pour gérer l'asymétrie de données pour un réducteur. Scénario: Dispose d'une clé composite et d'un partitionneur personnalisés pour acheminer les données vers les réducteurs. Afin de traiter le cas impaire, mais très probablement un million de clés et de grandes valeurs finissant sur le même réducteur ont besoin d'une sorte d'heuristique afin que ces données puissent être partitionnées pour générer de nouveaux réducteurs. pensée Am d'un processus en deux étapesHadoop manipulant l'inclinaison des données dans le réducteur

  1. set mapred.max.reduce.failures.percent dire 10% et de laisser le travail complet
  2. réexécutez le travail sur les données ayant échoué fixées par le passage d'une configuration par le biais du pilote qui provoquera mon partitionneur à puis partitionner de manière aléatoire les données asymétriques. Le partitionneur implémente l'interface Configurable.

Existe-t-il un meilleur moyen?

Une contre-solution possible peut consister à écrire la sortie des mappeurs et à essorer un autre travail de mappage effectuant le travail du réducteur, mais ne pas mettre sous pression le namenode.

Répondre

2

Cette idée me vient à l'esprit, je ne sais pas si c'est bon. Supposons que vous exécutiez actuellement le Job avec 10 mappeurs, ce qui échoue en raison de l'asymétrie des données. L'idée est, vous définissez le nombre de réducteur à 15 et définissez également ce que le nombre maximal de (clé, valeur) devrait aller à un réducteur de chaque mappeur. Vous conservez ces informations dans une mappe de hachage dans votre classe de partitionnement personnalisée. Une fois qu'un réducteur particulier atteint la limite, vous commencez à envoyer l'ensemble de paires (clé, valeur) suivant à un autre réducteur à partir du réducteur supplémentaire 5 que nous avons conservé pour gérer l'asymétrie.

+0

Oui, un problème avec ceci est qu'en quelque sorte mes données sont réparties uniformément de sorte qu'elles finissent dans différents mappeurs sous le nombre maximum alors je finirais toujours avec ce problème. L'autre problème peut être la quantité de clés qui sont stockées dans la carte, ce qui peut être résolu en utilisant un type de politique mru ... – sunny

1

Si vous l'autorisez, L'utilisation d'un combinateur (fonction de type réduit) pourrait vous aider. Si vous pré-agrégez les données du côté Mappeur. Ensuite, même si toutes vos données se retrouvent dans le même réducteur, la quantité de données pourrait être gérable.

Une alternative pourrait être de réimplémenter le partitionneur pour éviter le cas d'inclinaison.

+0

Devrait probablement avoir ajouté un peu plus de détails. Le travail que j'exécute incorpore un tri secondaire essentiellement pour grouper les données logiquement dans le réducteur, c'est-à-dire que ce travail n'est pas un travail d'agrégation. – sunny

+0

Le tri secondaire consiste uniquement à trier les valeurs associées à une clé. Le combineur est comme un réducteur local dans un conteneur de mappeur. Il agrège toutes les valeurs associées à la même clé dans SEUL un mappeur et transfère le résultat au réducteur pour permettre l'agrégation complète de toutes les données du mappeur. – RojoSam

+0

Ensuite, au lieu d'émettre 1000 valeurs sous la forme (key1,1), (key1,1),. . . (key1,1) d'un mapper au réducteur, avec le combineur la carte seulement émettra un enregistrement avec (key1,1000). En supposant que votre réducteur ajoute les valeurs. Alors même vos données continuent d'être biaisées, au lieu de recevoir 1 million de valeurs dans un réducteur. Il pourrait ne recevoir que 100 avec des agrégations partielles. Avec "addition" est très facile mais toutes les agrégations ne permettent pas d'agrégations partielles. – RojoSam