我有一個應用程序需要讀取一個文件,這是一個ArrayList的序列化結果。(ArrayList<String>
,該列表中的50000條記錄,大小:20MB) 我不確定如何將數據讀入到hadoop平臺。我只有一些意識,我需要重寫InputFormat和OutpurFormat。 我是hadoop平臺的初學者。你能給我一些建議嗎?如何覆蓋InputFormat和OutputFormat在hadoop應用程序
謝謝,
鄭。
我有一個應用程序需要讀取一個文件,這是一個ArrayList的序列化結果。(ArrayList<String>
,該列表中的50000條記錄,大小:20MB) 我不確定如何將數據讀入到hadoop平臺。我只有一些意識,我需要重寫InputFormat和OutpurFormat。 我是hadoop平臺的初學者。你能給我一些建議嗎?如何覆蓋InputFormat和OutputFormat在hadoop應用程序
謝謝,
鄭。
首先,您需要擴展FileInputFormat,值得注意的是實施抽象FileInputFormat.createRecordReader方法。
您可以查看類似LineRecordReader(這是TextInputFormat用於處理文本文件的內容)的來源。
從那裏你幾乎是你自己的(即它取決於你的ArrayList已被序列化)。查看LineRecordReader的源代碼,並嘗試將其與您的ArrayList已被序列化的方式聯繫起來。
其他值得注意的是,你的文件格式是否可拆分?即你可以尋求文件中的偏移量並從那裏恢復流(文本文件可以向前掃描到當前行的末尾,然後從那裏開始)。如果你的文件格式使用壓縮,你也需要考慮到這一點(例如,你不能在gzip文件中隨機尋找一個位置)。默認情況下,FileInputFormat.isSplittable將返回true,您可能最初想要覆蓋它爲false。如果你堅持使用'unsplittable',那麼請注意你的文件將被一個映射器處理(不管它的大小)。
謝謝!這就是我正在尋找的。 – zwang
在處理Hadoop上的數據之前,您應該將數據上載到HDFS或其他受支持的原因文件系統,如果這些文件系統沒有被別的東西上傳。如果您在控制上載過程中,您可以在上傳階段的數據轉換爲東西,你可以很容易的過程,如:
這是最簡單的解決方案,因爲您不必干涉Hadoop的內部。
您可以添加一些細節嗎?您的應用程序是地圖/縮減工作嗎?如果是這樣,爲什麼你需要在hadoop上只處理20MB,或者每個數組項目都是params,以便在羣集上進行繁重的計算。可能只想從HDFS讀取數據? – rystsov
20MB只是一個測試文件。最後的實驗將會達到200GB,所以我使用Hadoop平臺。我在我的linux服務器上有這個20MB文件。該服務器還安裝hadoop。我想寫一份工作來處理這個文件。我知道如何寫映射器和減速器。但我不知道如何讀取映射類的文件進行處理。我使用'hadoop dfs -copyFromLocal /home/me/test.byte/home/test/test.byte'將文件放入HDFS。你能給我一些建議嗎? – zwang