2015-10-20 78 views
0

我有一個mapreduce作業,可導出hbase表的純文本。我正在模擬帶有hbase並且不運行任何reducer的Export類。另外,我只是爲這個鍵寫了一個空字符串。事情是這樣的:小型映射器零件文件

public void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException { 
    List<Cell> cells = value.listCells(); 
    for(Cell cell : cells) { 
     context 
      .write(new Text(""), new Text(CellUtil.cloneValue(cell))); 
    } 
} 

這工作得很好,但我在然而,許多分裂的憐憫中有HBase的表方面的輸出映射文件(例如部分M-NNNNN)的數量。

有沒有辦法在mapreduce作業中合併輸出映射文件?

我已經考慮過使用一個1-50之間的隨機整數作爲鍵,然後使用一個reducer,然後在寫出HDFS之前剝掉鍵,但是這看起來像是一個黑客。

回答

1

無論您的輸入如何,我知道您要合併所有的地圖輸出。以下是選項。

  1. getmerge shell命令 - 這會將合併文件提供給本地目錄。
  2. 使輸入不可拆分,因此只有一個映射器運行和一個映射器輸出 - 由於您正在閱讀HBase,因此使用單個映射器執行整個工作可能不是一個好的選擇。
  3. 寫一個reducer並設置map reduce只有一個reducer,這就是你在做什麼。

鑑於您與HBase的聯繫,1,3是不錯的選擇。不知道爲什麼你認爲它是黑客。您可以使用行鍵作爲映射器輸出鍵而不是隨機整數。

+0

如果我使用rowkey,我認爲它會以相同的問題結束,因爲這些密鑰都非常不同,對吧? – javamonkey79

+1

您將獲得每個映射器的一個輸出文件。既然你需要分裂,你無法避免這種情況。行鍵正在自然移動以維護唯一鍵。由於您只配置一個reducer,因此所有mapper輸出文件都將被引導至一個reducer。因此只有一個輸出文件。 – Ramzy

+0

謝謝,我會嘗試其中的一些 – javamonkey79