2011-10-05 1 views
2

donc quand nous utilisons pour écrire Java programme map/reduce, la carte collecte les données et le réducteur reçoit la liste des valeurs par clé, commehadoop streaming: comment donner la liste des valeurs clés au réducteur?

Map(k, v) -> k1, v1 
    then shuffle and sort happens 
    then reducer gets it 

reduce(k1, List<values>) 

travailler. mais est-il possible de faire la même chose avec python en utilisant streaming? J'ai utilisé this comme référence et j'ai l'impression qu'un réducteur obtient des données par ligne comme indiqué sur la ligne de commande

+1

Il est livré via sys.stdin –

Répondre

1

Dans Hadoop Streaming, le mappeur écrit des paires valeur/clé sur sys.stdout. Hadoop fait le shuffle et le tri et dirige les résultats vers le mappeur au sys.stdin. La façon dont vous gérez réellement la carte et la réduction dépend entièrement de vous, tant que vous suivez ce modèle (mappez sur stdout, réduisez de stdin). C'est pourquoi il peut être testé indépendamment de Hadoop via cat data | map | sort | reduce sur la ligne de commande.

L'entrée du réducteur est la même que celle des paires valeur/clé qui ont été mappées mais qui sont triées. Vous pouvez parcourir les résultats et accumuler les totaux comme le montre l'exemple, ou vous pouvez aller plus loin et passer l'entrée à itertools.groupby() et cela vous donnera l'équivalent de l'entrée k1, List<values> à laquelle vous êtes habitué, et qui fonctionne bien le reduce() intégré Le point étant que c'est à vous de mettre en œuvre le réduire.

1

PipeReducer est l'implémentation du réducteur pour le streaming Hadoop. Le réducteur obtient clé/valeurs, l'itère et l'envoie au STDIN sous la forme clé/valeur et non clé/valeurs. C'est le comportement par défaut du streaming Hadoop. Je ne vois aucune option pour changer cela, sauf si le code Hadoop a été modifié.

public void reduce(Object key, Iterator values, OutputCollector output, 
       Reporter reporter) throws IOException { 

    ..... 
    while (values.hasNext()) { 
    ..... 
     inWriter_.writeKey(key); 
     inWriter_.writeValue(val); 
    .....  
    } 
} 
5

Peut être cela peut vous aider. J'ai trouvé de apache ... org

Personnalisation de la façon de lignes divisé en paires clé/valeur Comme indiqué précédemment, lorsque le cadre Map/Reduce lit une ligne du stdout du cartographe, il divise la ligne dans une paire clé/valeur. Par défaut, le préfixe de la ligne jusqu'au premier caractère de tabulation est la clé et le reste de la ligne (à l'exception du caractère de tabulation) est la valeur.

Toutefois, vous pouvez personnaliser cette valeur par défaut. Vous pouvez spécifier un séparateur de champ autre que le caractère de tabulation (valeur par défaut), et vous pouvez spécifier le caractère nth (n> = 1) plutôt que le premier caractère d'une ligne (par défaut) comme séparateur entre la clé et la valeur. Par exemple:

$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ 
    -input myInputDirs \ 
    -output myOutputDir \ 
    -mapper org.apache.hadoop.mapred.lib.IdentityMapper \ 
    -reducer org.apache.hadoop.mapred.lib.IdentityReducer \ 
    -D stream.map.output.field.separator=. \ 
    -D stream.num.map.output.key.fields=4 

Dans l'exemple ci-dessus, -D stream.map.output.field.separator=. précise "" comme le séparateur de champ pour les sorties de la carte, et le préfixe jusqu'à la quatrième "." dans une ligne sera la clé et le reste de la ligne (à l'exclusion du quatrième ".") sera la valeur. Si une ligne a moins de quatre "." S, alors toute la ligne sera la clé et la valeur sera un objet Text vide (comme celui créé par new Text ("")).

De même, vous pouvez utiliser -D stream.reduce.output.field.separator=SEP et -D stream.num.reduce.output.fields=NUM pour spécifier le nième séparateur de zone dans une ligne des sorties réduites en tant que séparateur entre la clé et la valeur.

De même, vous pouvez spécifier stream.map.input.field.separator et stream.reduce.input.field.separator comme séparateur d'entrée pour les entrées de mappage/réduction. Par défaut, le séparateur est le caractère de tabulation.

Questions connexes