2013-07-22 2 views
0

J'ai un problème lorsque je dois générer un numéro de séquence à partir de 1 dans le fichier entier.Générer un numéro de séquence à l'aide de Map Reduce

Ex permet de dire que j'ai un gros fichier comme suit: -

abc, 123
abb, 111
ccc, 122
..... N nombre de cette ligne

maintenant ma sortie devrait être comme suit: -

1, abc, 123
2, abb, 111
3, ccc, 122
.... ainsi de suite. Le problème de faire ceci en utilisant mapreduce est que chaque division du fichier est traitée en parallèle par une fonction de carte différente en raison de laquelle la séquence n'a pas pu être maintenue. S'il vous plaît ne me dites pas d'utiliser un seul réducteur pour le faire. Je ne veux pas utiliser de réducteur unique car je veux le faire en parallèle en utilisant le travail typique de mapreduce. Donc, y a-t-il un meilleur moyen pour que cela puisse être fait en utilisant map-reduce?

+2

Voir ce qui devrait être utile: http://blog.data-miners.com/2009/11/hadoop-and-mapreduce -parallel-program.html – Amar

+0

Avez-vous besoin de maintenir l'ordre? – twid

+0

Oui, j'ai besoin que la commande soit maintenue – Binary01

Répondre

0

Vous pouvez le faire, mais c'est un peu délicat. Vous devez utiliser la variable d'environnement "mapred_job_id" qui vous donne l'identifiant du réducteur. Par exemple, lorsque vous lisez la variable "mapred_job_id", vous pouvez obtenir quelque chose comme ceci: "job_201302272236_0001". Vous pouvez prendre la dernière partie de cet ID de travail, qui est "0001". A l'aide de ceci, vous pouvez construire un préfixe pour chacune des lignes sorties par le réducteur. Par exemple, si vous savez que chaque réducteur génère un maximum de 1000 lignes, vous pouvez avoir la sortie de ce réducteur de 1000-1999. Le deuxième réducteur aurait un ID de travail "job_201302272236_0002", il faudrait donc 2000-2999.

Exemple de code pour l'algorithme ci-dessus en utilisant Python (Hadoop en streaming):

import os, sys 
jobID = os.environ['mapred_job_id'] 
reducerID = jobID.split("_")[-1] 

count = 0 
for line in sys.stdin: 
    print str((reducerID*NUM)+count) + "," + line 
    count += 1