2013-11-15 37 views
0

我有一個大型數據集,作爲序列文件被攝入到HDFS中,其中的關鍵字是文件元數據併爲整個文件內容賦值。我正在使用SequenceFileInputFormat,因此我的分割基於序列文件同步點。用於在MapReduce中流式傳輸數據的自定義輸入拆分

我面臨的問題是,當我攝取真正的大文件時,我基本上將整個文件加載到Mapper/Reducer中的內存中,因爲值是整個文件內容。我正在尋找流式傳輸文件內容的方法,同時保留序列文件容器。我甚至想過編寫自定義分割,但不知道如何保留序列文件容器。

任何想法都會有所幫助。

回答

0

由於以下兩個原因,自定義拆分方法不適用於此方案。

1)整個文件正在加載到Map節點,因爲Map函數需要整個文件(因爲value =整個內容)。如果你分割文件,Map函數只接收一個部分記錄(值),它會失敗。

2)序列文件容器可能將您的文件視爲「單個記錄」文件。所以,它最多隻有1個同步點,即在Header之後。因此,即使您保留序列文件容器的同步點,整個文件也會在現在加載時加載到地圖節點。

0

如果編寫自定義分割,我有關於丟失序列文件同步點的疑慮。我正在考慮修改序列文件輸入格式/記錄讀取器來返回文件內容的塊而不是整個文件,但是爲每個塊返回相同的密鑰。

分塊策略類似於在MapReduce中計算文件分割的方式。