如何将参数传递给python Hadoop流媒体作业?

时间:2012-03-01 00:43:47

标签: python hadoop hadoop-streaming

对于python Hadoop流作业,如何将参数传递给例如reducer脚本,以便根据传入的参数使其行为不同?

我了解流媒体作业的格式为:

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

我想影响reducer.py。

4 个答案:

答案 0 :(得分:16)

命令行选项-reducer的参数可以是任何命令,因此您可以尝试:

$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

假设myReducer.py可执行。免责声明:我没有尝试过,但我之前已将类似的复杂字符串传递给-mapper-reducer

那就是说,你试过

吗?
-cmdenv name=value

选项,让你的Python reducer从环境中获取价值?这只是另一种做事方式。

答案 1 :(得分:2)

在Python代码中,

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

在你的Hapdoop命令中包括:

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

答案 2 :(得分:1)

如果您正在使用python,您可能需要查看dumbo,它提供了一个围绕hadoop流的好包装。 在dumbo中,您可以使用-param传递参数,如下所示:

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

然后在reducer中读取它

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

您可以在dumbo tutorial

中阅读更多内容

答案 3 :(得分:0)

您可以-reducer作为以下命令

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

您可以对此进行修改 Link