2012-10-06 55 views
1

我有一個應用程序需要讀取一個文件,這是一個ArrayList的序列化結果。(ArrayList<String>,該列表中的50000條記錄,大小:20MB) 我不確定如何將數據讀入到hadoop平臺。我只有一些意識,我需要重寫InputFormat和OutpurFormat。 我是hadoop平臺的初學者。你能給我一些建議嗎?如何覆蓋InputFormat和OutputFormat在hadoop應用程序

謝謝,

鄭。

+0

您可以添加一些細節嗎?您的應用程序是地圖/縮減工作嗎?如果是這樣,爲什麼你需要在hadoop上只處理20MB,或者每個數組項目都是params,以便在羣集上進行繁重的計算。可能只想從HDFS讀取數據? – rystsov

+0

20MB只是一個測試文件。最後的實驗將會達到200GB,所以我使用Hadoop平臺。我在我的linux服務器上有這個20MB文件。該服務器還安裝hadoop。我想寫一份工作來處理這個文件。我知道如何寫映射器和減速器。但我不知道如何讀取映射類的文件進行處理。我使用'hadoop dfs -copyFromLocal /home/me/test.byte/home/test/test.byte'將文件放入HDFS。你能給我一些建議嗎? – zwang

回答

2

首先,您需要擴展FileInputFormat,值得注意的是實施抽象FileInputFormat.createRecordReader方法。

您可以查看類似LineRecordReader(這是TextInputFormat用於處理文本文件的內容)的來源。

從那裏你幾乎是你自己的(即它取決於你的ArrayList已被序列化)。查看LineRecordReader的源代碼,並嘗試將其與您的ArrayList已被序列化的方式聯繫起來。

其他值得注意的是,你的文件格式是否可拆分?即你可以尋求文件中的偏移量並從那裏恢復流(文本文件可以向前掃描到當前行的末尾,然後從那裏開始)。如果你的文件格式使用壓縮,你也需要考慮到這一點(例如,你不能在gzip文件中隨機尋找一個位置)。默認情況下,FileInputFormat.isSplittable將返回true,您可能最初想要覆蓋它爲false。如果你堅持使用'unsplittable',那麼請注意你的文件將被一個映射器處理(不管它的大小)。

+0

謝謝!這就是我正在尋找的。 – zwang

0

在處理Hadoop上的數據之前,您應該將數據上載到HDFS或其他受支持的原因文件系統,如果這些文件系統沒有被別的東西上傳。如果您在控制上載過程中,您可以在上傳階段的數據轉換爲東西,你可以很容易的過程,如:

  • 簡單的文本文件(每個陣列的產品線)
  • SequenceFile如果數組可以包含與「線\ n'

這是最簡單的解決方案,因爲您不必干涉Hadoop的內部。