2010-07-26 5 views
1

J'ai un grand nombre de fichiers texte dans un répertoire S3. Pour chaque fichier texte, je souhaite appliquer une fonction (un exécutable chargé par l'amorçage) puis écrire les résultats dans un autre fichier texte portant le même nom dans un répertoire de sortie de S3. Il n'y a donc pas d'étape de réduction évidente dans mon travail MapReduce.Traitement de fichiers avec Elastic MapReduce - Pas d'étape de réduction?

J'ai essayé d'utiliser NONE comme mon réducteur, mais le répertoire de sortie se remplit avec des fichiers comme partie-00000, partie-00001, etc. Et il y en a plus que des fichiers dans mon répertoire d'entrée; chaque partie-fichier représente seulement un fragment traité.

Un conseil est apprécié.

+0

Merci pour votre aide, tout le monde. J'ai trouvé une autre réponse à cette question dans la FAQ Hadoop Streaming: http://hadoop.apache.org/common/docs/current/streaming.html#How+do+I+process+files%2C+one+per + carte% 3F – 345871345

Répondre

0

il semble de ce que j'ai lu sur Hadoop est que vous avez besoin d'un réducteur, même si elle ne change pas la sortie de cartographes juste pour fusionner les sorties de cartographes

4

Hadoop fournit un réducteur appelé l'identité Réducteur. Le réducteur d'identité délivre littéralement tout ce qu'il a pris (c'est la relation d'identité)

C'est ce que vous voulez faire, et si vous ne spécifiez pas de réducteur, le système Hadoop utilisera automatiquement ce réducteur pour vos travaux. La même chose est vraie pour le streaming Hadoop. Ce réducteur est utilisé exactement pour ce que vous avez décrit.

Je n'ai jamais exécuté un travail qui ne génère pas les fichiers en tant que partie - ####. J'ai fait quelques recherches et trouvé que vous pouvez faire ce que vous voulez en sous-classant la classe OutputFormat. Vous pouvez voir ce que j'ai trouvé ici: http://wiki.apache.org/hadoop/FAQ#A27. Désolé, je n'ai pas d'exemple.

Pour situer mes sources, j'ai appris la plupart de cela à partir du livre de Tom White: http://www.hadoopbook.com/.

0

Vous n'avez pas besoin d'un réducteur. Vous pouvez définir le nombre de réducteurs à 0 dans la phase de configuration d'emploi, par exemple

job.setNumReduceTasks(0); 

En outre, pour faire en sorte que chaque mappeur traite un fichier d'entrée complet, vous pouvez dire Hadoop que les fichiers d'entrée ne sont pas séparables. Le FileInputFormat a une méthode

protected boolean isSplitable(JobContext context, Path filename) 

qui peut être utilisé pour marquer un fichier comme ne pouvant être divisée, ce qui signifie qu'il sera traité par un mappeur. Voir here pour la documentation. Je viens de relire votre question, et je me suis rendu compte que votre entrée est probablement un fichier avec une liste de noms de fichiers, donc vous voulez probablement le diviser ou il ne sera exécuté que par un seul mappeur.

Ce que je ferais dans votre situation est d'avoir une entrée qui est une liste de noms de fichiers dans s3. L'entrée du mappeur est alors un nom de fichier, qu'il télécharge et exécute votre exe par. La sortie de cette exécution exe est ensuite téléchargée sur s3 et le mappeur passe au fichier suivant. Le mappeur n'a alors plus besoin de sortir quoi que ce soit. Bien que cela puisse être une bonne idée de sortir le nom du fichier traité afin que vous puissiez vérifier par la suite l'entrée. En utilisant la méthode que je viens de décrire, vous n'avez pas besoin d'utiliser la méthode isSplitable.

Questions connexes