11 votes

Comment passer un paramètre à un job de streaming Hadoop en python ?

Pour un travail de streaming Hadoop en python, comment puis-je passer un paramètre à, par exemple, le réducteur script pour qu'il se comporte différemment en fonction du paramètre passé ?

Je comprends que les emplois en streaming sont appelés dans le format suivant :

hadoop jar hadoop-streaming.jar -input -output -mapper mapper.py -reducer reducer.py ...

Je veux affecter reducer.py.

18voto

Ray Toal Points 35382

L'argument de l'option de ligne de commande -reducer peut être n'importe quelle commande, donc vous pouvez essayer :

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
    -input inputDirs \
    -output outputDir \
    -mapper myMapper.py \
    -reducer 'myReducer.py 1 2 3' \
    -file myMapper.py \
    -file myReducer.py

en supposant que myReducer.py est rendu exécutable. Disclaimer : Je n'ai pas essayé, mais j'ai passé des chaînes complexes similaires à -mapper et -reducer avant.

Cela dit, avez-vous essayé le

-cmdenv name=value

et simplement faire en sorte que votre réducteur Python obtienne sa valeur de l'environnement ? C'est juste une autre façon de faire les choses.

2voto

luismartingil Points 101

Dans votre code Python,

import os
(...)
os.environ["PARAM_OPT"]

Dans votre commande Hapdoop, incluez :

hadoop jar \
(...)
-cmdenv PARAM_OPT=value\
(...)

2voto

Mohamed El-Touny Points 315

Vous pouvez -reducer comme la commande ci-dessous

hadoop jar hadoop-streaming.jar \
-mapper 'count_mapper.py arg1 arg2' -file count_mapper.py \
-reducer 'count_reducer.py arg3' -file count_reducer.py \

vous pouvez réviser ceci Lien

1voto

Arnon Rotem-Gal-Oz Points 8055

Si vous utilisez python, vous pouvez consulter le site suivant dumbo qui fournit une enveloppe agréable autour du streaming d'Hadoop. Dans dumbo, vous passez des paramètres avec -param comme dans :

dumbo start yourpython.py -hadoop <hadoop-path> -input <input> -output <output>  -param <parameter>=<value>

Et ensuite le lire dans le réducteur

def reducer:
def __init__(self):
    self.parmeter = int(self.params["<parameter>"])
def __call__(self, key, values):
    do something interesting ...

Vous pouvez en savoir plus dans le tutoriel dumbo

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X