2015-10-20 60 views
0

我試圖實現除了實際數據集(輸入)之外還處理大型文本文件(作爲查找文件)的MapReduce作業。查找文件大於2GB。 我試圖加載文本文件作爲第三個參數如下:Hadoop分佈式緩存處理大查找文本文件

但我得到了Java堆空間錯誤。

做了一些搜索之後,建議使用分佈式緩存。這是我迄今 首先做的,我用這個方法來讀取查找文件:

public static String readDistributedFile(Context context) throws IOException { 
     URI[] cacheFiles = context.getCacheFiles(); 
     Path path = new Path(cacheFiles[0].getPath().toString()); 
     FileSystem fs = FileSystem.get(new Configuration()); 
     StringBuilder sb = new StringBuilder(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(path))); 
     String line; 
     while ((line = br.readLine()) != null) { 
      // split line 
      sb.append(line); 
      sb.append("\n"); 
     } 
     br.close(); 
     return sb.toString();   
    } 

其次,在製圖員:

protected void setup(Context context) 
       throws IOException, InterruptedException { 
      super.setup(context); 

      String lookUpText = readDistributedFile(context); 
      //do something with the text 
     } 

三,運行作業

hadoop jar mapReduceJob.jar the.specific.class -files ../LargeLookUpFileInStoredLocally.txt /user/name/inputdataset/*.gz /user/name/output 

但問題是,這項工作需要很長時間才能加載。 可能是使用分佈式緩存不是一個好主意,也可能是我在代碼中丟失了某些東西。

我正在使用Hadoop 2.5。 我已經檢查了一些相關的問題,例如[1]。

任何想法都會很棒!

[1] Hadoop DistributedCache is deprecated - what is the preferred API?

回答

0

分佈式緩存主要用於移動它們通過地圖所需的文件減少在任務節點,並不罐子的一部分。

其他用法是在執行包含大小數據集的連接時,爲了不使用多個輸入路徑,我們使用單個輸入(大)文件,然後使用分佈式緩存獲取另一個小文件,然後比較(或加入)兩個數據集。

在您的情況下更多時間的原因是因爲您試圖在地圖縮小開始之前讀取整個2 GB文件(因爲它是在安裝方法中啓動的)。

你可以給出你爲什麼使用分佈式緩存加載巨大的2GB文件的原因。

+0

非常感謝您的回覆。我只需要一種方法來加載除我的數據集以外的額外輸入。這個2G文件將以不同於數據集的方式進行處理。當我在本地加載它時(作爲第三個參數),該類拋出Java堆空間錯誤。以這種方式搜索一些網站後。你知道更好的方法嗎? – Daisy

+0

正如我上面所說,多輸入是另一種選擇。你將有兩個映射器,每個處理不同的格式。但是你也需要一些屬性,這在你的實際輸入中也是存在的。最終你正在加入。你能解釋一下,你對這個文件做了什麼,以及你如何將它與實際輸入連接起來? – Ramzy

+0

此大文件被視爲「作業處理主數據集所需的額外只讀數據」。因此,根據Hadoop:權威指南,可以使用「作業配置」或「分佈式緩存」來完成。我的問題是這個文件真的很大。 – Daisy

相關問題