2012-10-25 40 views
2

我必須在非常大的文本文件(如5 TB大小)中處理數據。處理邏輯使用supercsv解析數據並對其執行一些檢查。顯然,由於規模相當大,我們計劃使用hadoop來利用並行計算。我在我的機器上安裝hadoop,然後開始編寫mapper和reducer類,並且卡住了。因爲地圖需要一個關鍵值對,所以要閱讀這個文本文件,我不確定這個特定場景中的關鍵和價值是什麼。有人可以幫我解決這個問題嗎?Hadoop with supercsv

我的思維過程就像這樣(讓我知道我是否正確) 1)使用superCSV和hadoop爲hdfs中的每個文件塊生成supercsv bean(我假設hadoop注意分裂文件) 2)對於這些supercsvbeans運行我的檢查邏輯。

回答

3

數據是換行符嗎?即如果你只是分割每個換行符上的數據,每個塊是否總是單個完整的記錄?這取決於superCSV如何編碼文本,以及您的實際數據是否包含換行符。

如果是:

只要使用TextInputFormat。它爲您提供(我認爲)字節偏移量作爲映射鍵,整行作爲值。您可以忽略該鍵,並使用superCSV解析該行。

如果沒有:

你必須編寫自己的定製InputFormat - 這裏有一個很好的教程:http://developer.yahoo.com/hadoop/tutorial/module5.html#fileformat。關鍵是什麼以及價值的具體細節對於映射器輸入來說無關緊要;只要確保其中一個包含您想要的實際數據。你甚至可以使用NullWritable作爲其中之一的類型。

+0

要清楚的是,如果它的文本輸入鍵是'LongWritable'而且值是'Text'。 –

+0

是的,實際數據是以換行符分隔的。按照你的建議,我需要使用byteoffset作爲鍵和行(被supercsv解析的對象)作爲值。那麼這是否意味着每行都將在集羣中的節點上進行處理?我在想的是hadoop會分割文件,我會發送相應的supercsv對象作爲值 – user1707141

+0

Hadoop將分割文件並向每個映射器提供很多行,是的,這將通過羣集分發。您可以將行解析爲supercsv對象作爲映射器中的第一步,並且具有與使用自定義輸入格式基本相同的結果,但沒有實際編寫/調試的麻煩。 –