Python Hadoop ストリーミング ジョブの場合、たとえばレデューサー スクリプトにパラメーターを渡して、渡されるパラメーターに基づいて異なる動作をさせるにはどうすればよいですか?
ストリーミング ジョブが次の形式で呼び出されることを理解しています。
hadoop jar hadoop-streaming.jar -input -output -mapper mapper.py -reducer reducer.py ...
reducer.py に影響を与えたい。
Python Hadoop ストリーミング ジョブの場合、たとえばレデューサー スクリプトにパラメーターを渡して、渡されるパラメーターに基づいて異なる動作をさせるにはどうすればよいですか?
ストリーミング ジョブが次の形式で呼び出されることを理解しています。
hadoop jar hadoop-streaming.jar -input -output -mapper mapper.py -reducer reducer.py ...
reducer.py に影響を与えたい。
コマンド ライン オプションの引数には-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 レデューサーに環境から値を取得させるだけですか? それは物事を行う別の方法です。
Python コードでは、
import os
(...)
os.environ["PARAM_OPT"]
Hapdoop コマンドに以下を含めます。
hadoop jar \
(...)
-cmdenv PARAM_OPT=value\
(...)
Pythonを使用している場合は、Hadoopストリーミングの優れたラッパーを提供するdumboを確認することをお勧めします。ダンボでは、次のように-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 ...
あなたはダンボチュートリアルでもっと読むことができます