11

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

我了解流式作业以以下格式调用:

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

我想影响reducer.py。

4

4 回答 4

18

命令行选项的参数-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 减速器从环境中获得它的价值?这只是做事的另一种方式。

于 2012-03-01T01:02:56.693 回答
2

在您的 Python 代码中,

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

在您的 Hapdoop 命令中包括:

hadoop jar \
(...)
-cmdenv PARAM_OPT=value\
(...)
于 2013-04-10T20:50:59.877 回答
2

您可以-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 \

你可以修改这个 链接

于 2018-11-29T12:20:44.613 回答
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 教程中阅读更多内容

于 2012-03-02T14:22:40.137 回答