天天看點

hadoop streaming多路輸出方法和注意點(附超大資料diff對比源碼)

hadoop 支援reduce多路輸出的功能,一個reduce可以輸出到多個part-xxxxx-x檔案中,其中x是a-z的字母之一,程式在輸出<key,value>對的時候,在value的後面追加"#x"字尾,比如#a,輸出的檔案就是part-00000-a,不同的字尾可以把key,value輸出到不同的檔案中,友善做輸出類型分類, #x僅僅用做指定輸出檔案字尾, 不會展現到輸出的内容中

啟動腳本中需要指定-outputformat org.apache.hadoop.mapred.lib.suffixmultipletextoutputformat或者-outputformat org.apache.hadoop.mapred.lib.suffixmultiplesequencefileoutputformat, 輸出就會按照多路輸出的方式進行分檔案輸出

所有标準輸出的value中都要加上 #x字尾,x代表a-z, 不然會報invalid suffix錯誤 

簡單示例如下:

在red腳本中可以是以的輸出都加上字尾, 這樣輸出就是分part的了,比如大資料diff對比的腳本

map.sh如下:

red.sh如下:

我的兩個大資料沒有diff, 是以輸出就是:

part-00000-c

part-00000-d

part-00000-e

part-00001-c

part-00001-d

part-00001-e

part-00002-c

part-00002-d

part-00002-e

沒有a和b結尾的

多路輸出最多支援26路, 也就是字母隻能是a-z範圍。

reduce的輸入key和value的分隔符預設是\t, 如果輸出中沒有\t,reduce腳本會把整行當作key, value就是空的,這時如果加了#x,會報invalid suffix錯誤,因為#x作為了key的一部分,這種問題一種是保證你的key和value是按照\t分隔的, 一種是指定自己想要的分隔符。