我試圖實現除了實際數據集(輸入)之外還處理大型文本文件(作爲查找文件)的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?
非常感謝您的回覆。我只需要一種方法來加載除我的數據集以外的額外輸入。這個2G文件將以不同於數據集的方式進行處理。當我在本地加載它時(作爲第三個參數),該類拋出Java堆空間錯誤。以這種方式搜索一些網站後。你知道更好的方法嗎? – Daisy
正如我上面所說,多輸入是另一種選擇。你將有兩個映射器,每個處理不同的格式。但是你也需要一些屬性,這在你的實際輸入中也是存在的。最終你正在加入。你能解釋一下,你對這個文件做了什麼,以及你如何將它與實際輸入連接起來? – Ramzy
此大文件被視爲「作業處理主數據集所需的額外只讀數據」。因此,根據Hadoop:權威指南,可以使用「作業配置」或「分佈式緩存」來完成。我的問題是這個文件真的很大。 – Daisy