2012-03-01 69 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\ 
(...)