9
votes

Hadoop Mapreduce: Possible de définir deux mappeurs et réducteurs dans une classe d'emploi Hadoop?

J'ai deux classes Java distinctes pour faire deux emplois de MapRéduce différents. Je peux les courir de manière indépendante. Les fichiers d'entrée sur lesquels ils fonctionnent sont les mêmes pour les deux emplois. Donc, ma question est de savoir s'il est possible de définir deux mappeurs et deux réducteurs dans une classe Java comme xxx

, puis comme xxx do Ces méthodes définies remplacent les précédentes ou ajoutent les nouveaux? J'ai essayé le code, mais cela exécute les seules classes les plus récentes qui m'apporte penser que cela remplace. Mais il doit y avoir une façon de faire ce droit?

La raison pour laquelle je demande que cela est que je ne peux lire les fichiers d'entrée qu'une seule fois (une E / S), puis traiter deux cartes réduisent les tâches. J'aimerais aussi savoir comment je peux écrire les fichiers de sortie en deux dossiers différents. Pour le moment, les deux travaux sont séparés et nécessitent une entrée et un répertoire de sortie.


0 commentaires

4 Réponses :


2
votes

Vous pouvez utiliser les classes multiplesInputs et multipleOutPUT pour cela, mais la sortie des deux mappeurs ira aux deux réducteurs. Si les flux de données pour les deux paires de mappeurs / réducteurs sont vraiment indépendants les uns des autres, conservez-les comme deux emplois distincts. À propos, plusieursinputts exécuteront vos mappeurs sans changer, mais les réducteurs devraient être modifiés afin d'utiliser plusieurs coups de vue


1 commentaires

@Chris Les deux paires de m² partagent la même contribution, ce qui m'a fait penser à pouvoir lire l'entrée une seule fois. Les mappeurs fonctionnent avec différentes clés. Cela signifie que les clés d'un mapper seront différentes de celles de l'autre mapper. La raison pour laquelle je pense que je pense que je peux lire les fichiers d'entrée une seule fois pour les traiter dans deux paires de MRS différentes qui fonctionnent en particulier.



0
votes

Selon ma compréhension, qui provient de l'utilisation de la carte-réduite avec le streaming Hadoop, vous pouvez chaîner plusieurs mappeurs et réducteurs où l'on consomme la sortie d'un autre

Mais vous ne devriez pas être en mesure d'exécuter simultanément différents mappeurs et réducteurs. Les mappeurs eux-mêmes dépendent du nombre de blocs à traiter. Le mapper doit être instancié sur la base de cette décision et non la variété de MAPPER disponible pour le travail.

[EDIT: basé sur votre commentaire]

Je ne pense pas que ce soit possible. Vous pouvez chaîner (où les réducteurs recevront toutes les entrées des mappeurs. Vous pouvez les séquencer, mais vous ne pouvez pas exécuter exclusivement des ensembles indépendants de mapper et de réducteurs.

Je pense que ce que vous pouvez faire est, même si vous recevez les deux entrées des mappeurs dans vos deux réducteurs, vous pouvez rendre la sortie de mappeurs (K, V) est telle sorte que vous puissiez distinguer vos réducteurs de quelle mapper a été l'origine de (k, v). De cette façon, les deux réducteurs peuvent traiter sur des paires sélectives (k, v).


2 commentaires

Cool, n'en pensait pas comme une possibilité. Mais comment puis-je séparer les fichiers de sortie, disons que je peux le gérer dans ma mise en œuvre de réducteur, j'ai besoin d'une manière ou d'une autre, spécifiez les clés qui sont écrites sur l'endroit.


Non Bob: Vous ne pouvez pas faire ça. Ce que vous pouvez faire sur MAP1, MAP2 est Soumettre K, V comme K, (MAP1, V) de sorte que dans le réducteur, vous savez où provient des données. Chaque réducteur crée son propre fichier dans la sortie de travail afin que votre sortie soit déjà séparée.



12
votes

Vous pouvez avoir plusieurs mappeurs, mais dans un travail, vous ne pouvez avoir qu'un seul réducteur. Et les fonctionnalités dont vous avez besoin sont multi-uneput , multiodoutput et genericwilitaire .

Utilisation de Multiinput , vous pouvez définir le mappeur et l'entrée d'entrée correspondante. Voici mon POST sur la façon de l'utiliser.

Utilisation d'un générique , vous pouvez séparer différentes classes d'entrée dans le réducteur. Voici mon publier sur la façon de l'utiliser.

Utilisation de multipleOutput , vous pouvez générer différentes classes dans le même réducteur.


1 commentaires

THX pour votre commentaire! Je vais les essayer.