Hadoop une Carte et de multiples Réduire
Nous avons un grand jeu de données à analyser avec plusieurs réduire fonctions.
Tous réduire algorithme de travailler sur le même ensemble de données générées par le même carte fonction. La lecture de l'ensemble de données volumineux coûte trop cher de faire à chaque fois, il serait mieux de lire qu'une seule fois et de passer le mappé de données à de multiples réduire fonctions.
Puis-je faire cela avec Hadoop? J'ai cherché les exemples et l'intarweb mais je ne pouvais pas trouver toutes les solutions.
Vous devez vous connecter pour publier un commentaire.
Attendez-vous chaque réducteur de travailler sur exactement les mêmes données cartographiées? Mais au moins, la "clé" doit être différente puisqu'il décide de réducteur aller.
Vous pouvez écrire une sortie pour plusieurs fois dans mappeur, et comme la sortie de la clé (où $i est la i-ème réducteur, et $key est votre clé d'origine). Et vous avez besoin d'ajouter un "outil de Partitionnement" pour s'assurer que ces enregistrements n sont distribués dans les réducteurs, basé sur $i. Ensuite, à l'aide de "GroupingComparator" pour regrouper des enregistrements originaux $key.
Il est possible de le faire, mais pas moyen trivial dans un M.
context.write()
méthode il plusieurs le transfert de données à partir de laMapper
objets. il résout uniquement le problème de lecture de fichier, non?Peut-être une solution simple serait d'écrire un travail qui n'ont pas une fonction de réduction. Afin de vous transmettre toutes les données mappées directement à la sortie de l'emploi. Vous venez de définir le nombre de réducteurs à zéro pour le travail.
Ensuite, vous devez écrire un emploi différent pour chaque fonction de réduction qui fonctionne sur les données recueillies. Cela signifierait le stockage de toutes les données cartographiées sur le HDFS bien.
Une autre alternative pourrait être de combiner tous vos réduire fonctions en un seul Réducteur de sorties à plusieurs fichiers, à l'aide d'une sortie différente pour chaque fonction. Plusieurs sorties sont mentionnés dans cet article pour hadoop 0.19. Je suis assez sûr que cette fonctionnalité est cassée dans la nouvelle mapreduce API publié avec 0.20.1, mais vous pouvez toujours l'utiliser dans les anciens mapred API.
Vous pouvez utiliser des clés composites. Disons que vous avez besoin de deux types de réducteurs, 'R1' et R2'. Ajouter les id de ces comme un préfixe de votre o/p touches dans le mappeur. Ainsi, dans le mappeur, une touche 'K' devient 'R1:K" ou "R2:K'.
Puis, dans le réducteur, de transmettre des valeurs à des implémentations de R1 ou R2 basé sur le préfixe.
Je suppose que vous voulez exécuter différents réducteurs dans une chaîne. Dans hadoop 'plusieurs réducteurs" signifie l'exécution de plusieurs instances de la même réducteur. Je propose que vous exécutez un réducteur, assurant ainsi une banale carte de fonction pour tous, sauf le premier. Afin de minimiser le temps de transfert de données, vous pouvez utiliser la compression.
Bien sûr, vous pouvez définir plusieurs réducteurs. Pour le Travail (Hadoop 0.20) juste ajouter:
Mais. Votre infrastructure à l'appui de la plusieurs réducteurs, ce qui signifie que vous avez à
Et bien sûr votre travail doit correspondre à certaines spécifications. Sans savoir exactement ce que vous voulez faire, je ne peux que donner des conseils généraux:
job.setPartitionerClass(...)
par exemple avec un aléatoires partitionnement ...
Vous allez obtenir plusieurs fichiers de sortie, un pour chaque réducteur. Si vous voulez un classement de sortie, vous devez ajouter un autre emploi à la lecture de tous les fichiers (plusieurs carte-tâches, cette fois ...) et l'écriture triés avec un seul réducteur ...
Ont un look trop à les Combiner de Classe, qui est la local Réducteur. Cela signifie que vous pouvez agréger (réduire) déjà en mémoire sur des données partielles émis par la carte.
Très bel exemple est le nombre de mots-Exemple. La carte émet chaque mot clé et son compte comme 1: (mot, 1). Le Combineur obtient des données partielles de la carte, émet (, ) localement. Le Réducteur est exactement la même, mais certains (Combiné) wordcounts sont déjà >1. Économise de la bande passante.
- Je encore n'obtenez pas votre problème, vous pouvez utiliser la séquence suivante:
de la base de données-->carte - >réduire(utiliser le chat ou rien en fonction de l'exigence)
ensuite stocker la représentation des données que vous avez extrait.
si vous dites que c'est assez petit pour tenir dans la mémoire, puis de les stocker sur le disque ne devrait pas être un problème.
Également votre utilisation du paradigme MapReduce pour le problème donné est incorrecte, à l'aide d'une carte unique de la fonction et de multiples "différents" réduire la fonction n'a pas de sens, il montre que vous êtes juste en utilisant la carte pour passer des données à différentes machines à faire des choses différentes. vous n'avez pas besoin hadoop ou toute autre architecture pour que.