Hadoop Streaming使用簡介
一、Hadoop Streaming
它是hadoop的一個工具,用來創建和運行一類特殊的map/reduce作業。所謂的特殊的map/reduce作業可以是可執行文件或腳本本件(python、PHP、c等)。Streaming使用“標準輸入”和“標準輸出”與我們編寫的Map和Reduce進行數據的交換。由此可知,任何能夠使用“標準輸入”和“標準輸出”的編程語言都可以用來編寫MapReduce程序。如下
-input myInputDirs 【hdfs系統中輸入文件/夾位置】
-output myOutputDir
-mapper cat
-reducer wc
-file 【需要分發的文件】
二、Hadoop 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的切分方式。
三、使用注意事項
1、使用Hadoop Streaming運行MapReduce會比用java代碼寫的MapReduce稍慢一些,原因如下:
Java運行Map任務輸出一定數量結果集后就會啟動Reduce任務,而使用Streaming要等到所有Map任務都執行完畢后才會啟動Reduce任務;
2、運行失敗
使用Hadoop Streaming時需要將mapper文件和reducer文件放到所有tasktracker節點上。或者采用 -file 選型指定文件,打包文件到提交的作業中,可以是mapper或者reducer要用的輸入文件,如配置文件,字典,framework會把文件當成作業提交的一部分分發到集群的機器上。。
3、只需要map函數處理數據,如何設置?
“-jobconf mapred.reduce.tasks=0” ,Map/Reduce框架就不會創建reducer任務,直接使用mapper任務的輸出做為最終輸出。
4、如何為作業指定其他插件
-inputformat JavaClassName
-outputformat JavaClassName
-partitioner JavaClassName 【用戶自定義的partitioner程序】
-combiner JavaClassName 【用戶自定義的combiner程序(必須用java實現)】
5、為作業指定附加配置參數
【-D】:作業的一些屬性(以前用的是-jonconf),具體有:
1)mapred.map.tasks:map task數目
2)mapred.reduce.tasks:reduce task數目
3)stream.map.input.field.separator/stream.map.output.field.separator: map task輸入/輸出數據的分隔符,默認均為\t。
4)stream.num.map.output.key.fields:指定map task輸出記錄中key所占的域數目
5)stream.reduce.input.field.separator/stream.reduce.output.field.separator:reduce task輸入/輸出數據的分隔符,默認均為\t。
6)stream.num.reduce.output.key.fields:指定reduce task輸出記錄中key所占的域數目
6、如何處理python程序map輸出文件,每行后面的的tab符 or 空格符;
問題原因:當Map/Reduce框架從mapper的標準輸入讀取一行時,它把這一行切分為key/value對。在默認情況下,每行第一個tab符之前的部分作為key,之后的部分作為value(不包括tab符)。
參考5做如下設置:建設分隔符是"^"【-jobconf mapred.textoutputformat.separator=^ -jobconf stream.map.output.field.separator=^】
7、如何輸出gzip文件格式的輸出
你只需設置streaming作業中的選項‘-jobconf mapred.output.compress=true -jobconf mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCode’
8、如何使用Streaming如何解析XML文檔?
可以使用StreamXmlRecordReader來解析XML文檔。hadoop jar hadoop-streaming.jar -inputreader "StreamXmlRecord,begin=BEGIN_STRING,end=END_STRING" ..... (rest of the command) Map任務會把BEGIN_STRING和END_STRING之間的部分看作一條記錄。
四、參考資料
轉自: http://blog.csdn.net/lazythinker/article/details/7063880