¿Cómo paso un parámetro a un trabajo de transmisión de Hadoop en Python?

Para un trabajo de transmisión por secuencias de Hadoop en Python, ¿cómo le paso un parámetro a, por ejemplo, el script reductor para que se comporte de forma diferente según el parámetro que se pasa?

Entiendo que los trabajos de transmisión se llaman en el formato de:

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

Quiero afectar a reducer.py.

El argumento de la opción de línea de comando -reducer puede ser cualquier comando, por lo que puede probar:

 $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 

asumiendo que myReducer.py se hace ejecutable. Descargo de responsabilidad: no lo he probado, pero antes he pasado cadenas similares similares a -mapper y -reducer .

Dicho esto, ¿has probado el

 -cmdenv name=value 

¿Opción, y solo que su reductor Python obtenga su valor del medio ambiente? Es solo otra forma de hacer las cosas.

En su código Python,

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

En tu comando de Hapdoop incluye:

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

Si está usando python, es posible que desee revisar dumbo, que proporciona una envoltura agradable para la transmisión de hadoop. En Dumbo pasas parámetros con -param como en:

 dumbo start yourpython.py -hadoop  -input  -output  -param = 

Y luego leerlo en el reductor.

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

Puedes leer más en el tutorial de dumbo.

Puede -reducer como el siguiente comando

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

puedes revisar este enlace