針對前面介紹的輸入格式,MapReduce也有相應的輸出格式。默認情況下只有一個 Reduce,輸出只有一個文件,默認文件名為 part-r-00000,輸出文件的個數與 Reduce 的個數一致。 如果有兩個Reduce,輸出結果就有兩個文件,第一個為part-r-00000,第二個為part-r-00001,依次類推
OutputFormat 接口
OutputFormat主要用於描述輸出數據的格式,它能夠將用戶提供的key/value對寫入特定格式的文件中。Hadoop 自帶了很多 OutputFormat 的實現,它們與InputFormat實現相對應,足夠滿足我們業務的需要。 OutputFormat 類的層次結構如下圖所示
OutputFormat是MapReduce輸出的基類,所有MapReduce輸出都實現了 OutputFormat 接口。 我們可以把這些實現接口類分為以下幾種類型,分別一一介紹
1、文本輸出
默認的輸出格式是TextOutputFormat,它把每條記錄寫為文本行。它的鍵和值可以是任意類型,因為TextOutputFormat調用toString()方法把它們轉換為字符串。每個鍵/值對由制表符進行分割,當然也可以設定 mapreduce.output.textoutputformat.separator 屬性(舊版本 API 中的 mapred.textoutputformat.separator)改變默認的分隔符。與 TextOutputFormat對應的輸入格式是KeyValueTextInputFormat,它通過可配置的分隔符將鍵/值對文本分割。
可以使用NullWritable來省略輸出的鍵或值(或兩者都省略,相當於 NullOutputFormat輸出格式,后者什么也不輸出)。這也會導致無分隔符輸出,以使輸出適合用 TextInputFormat 讀取
2、二進制輸出
1、關於SequenceFileOutputFormat
顧名思義,SequenceFileOutputFormat 將它的輸出寫為一個順序文件。如果輸出需要作為后續 MapReduce 任務的輸入,這便是一種很好的輸出格式, 因為它的格式緊湊,很容易被壓縮。
2、關於SequenceFileAsBinaryOutputFormat
SequenceFileAsBinaryOutputFormat 把鍵/值對作為二進制格式寫到一個 SequenceFile 容器中。
3、關於MapFileOutputFormat
MapFileOutputFormat 把 MapFile 作為輸出。MapFile 中的鍵必須順序添加,所以必須確保reducer輸出的鍵已經排好序
3、多個輸出
上面我們提到,默認情況下只有一個 Reduce,輸出只有一個文件。有時可能需要對輸出的文件名進行控制或讓每個 reducer 輸出多個文件。 我們有兩種方式實現reducer輸出多個文件。
1、Partitioner
具體示例,請參考”使用Partitioner實現輸出到多個文件”
這種方法實現多文件輸出,很多情況下是無法實現的,因為存在以下兩個缺點。
第一,需要在作業運行之前需要知道分區數,如果分區數未知,就無法操作。
第二,一般來說,讓應用程序來嚴格限定分區數並不好,因為可能導致分區數少或分區不均
2、MultipleOutputs類
MultipleOutputs 類可以將數據寫到多個文件,這些文件的名稱源於輸出的鍵和值或者任意字符串。這允許每個 reducer(或者只有 map 作業的 mapper)創建多個文件。采用name-m-nnnnn 形式的文件名用於 map 輸出,name-r-nnnnn 形式的文件名用於 reduce 輸出,其中 name 是由程序設定的任意名字, nnnnn 是一個指明塊號的整數(從 0 開始)。塊號保證從不同塊(mapper 或 reducer)輸出在相同名字情況下不會沖突。
具體示例,請參考”通過MultipleOutputs寫到多個文件”
4、數據庫輸出
DBOutputFormat 適用於將作業輸出數據(中等規模的數據)轉存到Mysql、Oracle等數據庫;使用DBOutputFormat以MapReduce的方式運行,會並行的連接數據庫。在這里需要合適的設置map、reduce的個數,以便將並行連接的數量控制在合理的范圍之內
具體示例,請參考“使用DBOutputFormat把MapReduce產生的結果集導入到mysql中”
如果,您認為閱讀這篇博客讓您有些收獲,不妨點擊一下右下角的【推薦】。
如果,您希望更容易地發現我的新博客,不妨點擊一下左下角的【關注我】。
如果,您對我的博客所講述的內容有興趣,請繼續關注我的后續博客,我是【劉超★ljc】。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

