2012-03-01 46 views
7

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

据我所知,流作业称为格式:

Hadoop的罐子Hadoop的streaming.jar - 输入 - 输出-mapper mapper.py -reducer reducer.py ...

我想影响reducer.py。

回答

14

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

1

如果你正在使用python,你可能想看看dumbo,它提供了一个很好的Hadoop流式封装。 在小飞象你通过与-param参数为:

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

然后在减速机读它

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

你可以阅读更多的dumbo tutorial

2

在Python代码,

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

在您的Hapdoop命令中包含:

hadoop jar \ 
(...) 
-cmdenv PARAM_OPT=value\ 
(...) 
相关问题