Hadoop Streaming
Hadoop streaming是Hadoop的一個工具, 它幫助用戶創建和運行一類特殊的map/reduce作業, 這些特殊的map/reduce作業是由一些可執行文件或腳本文件充當mapper或者reducer。例如:
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ -input myInputDirs \ -output myOutputDir \ -mapper /bin/cat \ -reducer /bin/wc
Streaming工作原理
在上面的例子裏,mapper和reducer都是可執行文件,它們從標準輸入讀入數據(一行一行讀), 並把計算結果發給標準輸出。Streaming工具會創建一個Map/Reduce作業, 並把它發送給合適的集羣,同時監視這個作業的整個執行過程。
如果一個可執行文件被用於mapper,則在mapper初始化時, 每一個mapper任務會把這個可執行文件作爲一個單獨的進程啓動。 mapper任務運行時,它把輸入切分成行並把每一行提供給可執行文件進程的標準輸入。 同時,mapper收集可執行文件進程標準輸出的內容,並把收到的每一行內容轉化成key/value對,作爲mapper的輸出。 默認情況下,一行中第一個tab之前的部分作爲key,之後的(不包括tab)作爲value。 如果沒有tab,整行作爲key值,value值爲null。不過,這可以定製,在下文中將會討論如何自定義key和value的切分方式。
如果一個可執行文件被用於reducer,每個reducer任務會把這個可執行文件作爲一個單獨的進程啓動。 Reducer任務運行時,它把輸入切分成行並把每一行提供給可執行文件進程的標準輸入。 同時,reducer收集可執行文件進程標準輸出的內容,並把每一行內容轉化成key/value對,作爲reducer的輸出。 默認情況下,一行中第一個tab之前的部分作爲key,之後的(不包括tab)作爲value。在下文中將會討論如何自定義key和value的切分方式。
這是Map/Reduce框架和streaming mapper/reducer之間的基本通信協議。
用戶也可以使用java類作爲mapper或者reducer。上面的例子與這裏的代碼等價:
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ -input myInputDirs \ -output myOutputDir \ -mapper org.apache.hadoop.mapred.lib.IdentityMapper \ -reducer /bin/wc
用戶可以設定stream.non.zero.exit.is.failure true 或false 來表明streaming task的返回值非零時是 Failure 還是Success。默認情況,streaming task返回非零時表示失敗。
將文件打包到提交的作業中
任何可執行文件都可以被指定爲mapper/reducer。這些可執行文件不需要事先存放在集羣上; 如果在集羣上還沒有,則需要用-file選項讓framework把可執行文件作爲作業的一部分,一起打包提交。例如:
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ -input myInputDirs \ -output myOutputDir \ -mapper myPythonScript.py \ -reducer /bin/wc \ -file myPythonScript.py
上面的例子描述了一個用戶把可執行python文件作爲mapper。 其中的選項“-file myPythonScirpt.py”使可執行python文件作爲作業提交的一部分被上傳到集羣的機器上。
除了可執行文件外,其他mapper或reducer需要用到的輔助文件(比如字典,配置文件等)也可以用這種方式打包上傳。例如:
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ -input myInputDirs \ -output myOutputDir \ -mapper myPythonScript.py \ -reducer /bin/wc \ -file myPythonScript.py \ -file myDictionary.txt