1. 程式人生 > >MapReduce系列之MapReduce的輸出

MapReduce系列之MapReduce的輸出

針對前面介紹的輸入格式,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

   這種方法實現多檔案輸出,很多情況下是無法實現的,因為存在以下兩個缺點。

   第一,需要在作業執行之前需要知道分割槽數,如果分割槽數未知,就無法操作。

    第二,一般來說,讓應用程式來嚴格限定分割槽數並不好,因為可能導致分割槽數少或分割槽不均

    2、MultipleOutputs類

    MultipleOutputs 類可以將資料寫到多個檔案,這些檔案的名稱源於輸出的鍵和值或者任意字串。這允許每個 reducer(或者只有 map 作業的 mapper)建立多個檔案。採用name-m-nnnnn 形式的檔名用於 map 輸出,name-r-nnnnn 形式的檔名用於 reduce 輸出,其中 name 是由程式設定的任意名字, nnnnn 是一個指明塊號的整數(從 0 開始)。塊號保證從不同塊(mapper 或 reducer)輸出在相同名字情況下不會衝突。

  一個案例:暫時沒有

4、資料庫輸出

  DBOutputFormat 適用於將作業輸出資料(中等規模的資料)轉存到Mysql、Oracle等資料庫;使用DBOutputFormat以MapReduce的方式執行,會並行的連線資料庫。在這裡需要合適的設定map、reduce的個數,以便將並行連線的數量控制在合理的範圍之內。不常用,先不介紹。

5、自定義輸出

     大體方法和自定義輸入類似,可以參考自定義輸入

一個案例:https://github.com/taowenjun/MapReduce/blob/master/cn/tao/logenhance/LogEnhanceOutputFormat.java

在驅動中指定該類:

job.setOutputFormatClass(LogEnhanceOutputFormat.class);