2012-06-20 39 views
2

我知道在這裏有類似的帖子,但我找不到一個真正有答案的人。使用Hadoop處理大型二進制文件

我們有一個加載了二進制文件的Hadoop集羣。這些文件的大小範圍可以從幾百k到幾百MB。

我們正在使用自定義記錄閱讀器處理這些文件,該閱讀器將文件的全部內容讀入每個地圖。從那裏我們提取我們想要的序列化爲JSON的適當元數據。

我們預見到的問題是我們最終可能會達到我們的namenode無法處理的大小。只有這麼多的記憶纔會出現,而擁有一個有幾TB內存的名稱節點似乎很荒謬。

有沒有一種優雅的方式來處理這樣的大型二進制文件?特別是那些不能拆分的,因爲我們不知道減速器將把它們放回到一起的順序是什麼?

回答

0

Namenode與存儲或處理沒有任何關係。您應該將注意力集中在Datanodes和TaskTracker上。另外,我不知道您是否試圖解決存儲問題或文件的處理問題這裏。如果你正在處理大量的二進制文件,值得看看Hadoop SequenceFile。 SequenceFile是一個由二進制鍵/值對組成的平面文件,因此廣泛用於MapReduce作爲輸入/輸出格式。當你有大量的二進制文件

http://wiki.apache.org/hadoop/SequenceFile 
0

,使用SequenceFile格式的輸入格式,並設置相應的mapred輸入分配大小 - 有關詳細說明,您可以訪問此頁面。您可以根據您設置的總輸入大小和分割大小來設置映射器的數量。 Hadoop將負責分解輸入數據。

如果您以某種格式壓縮了二進制文件,那麼hadoop就無法做到這一點。所以二進制格式必須是SequenceFile。

1

所以不是答案本身,而是我有這麼多的問題,這的評論列表會比較困難,傳達,所以這裏有雲:

你說你讀了整個內容到內存中的每個地圖,你能夠詳細說明這些文件的實際二進制輸入格式:

  • 它們是否包含邏輯記錄,即一個輸入文件是單個記錄,還是包含很多記錄?
  • 文件是壓縮的(事後還是某種內部壓縮機制)?
  • 你目前如何處理這個文件,你是什麼總體的ETL邏輯轉換爲JSON?
  • 實際上您是否需要在處理開始之前讀取讀入內存的整個文件,或者在您填充了某種大小的緩衝區(例如,DOM vs SAX XML解析)後是否可以處理該文件。

我的猜測是,您可以將一些映射器邏輯遷移到記錄讀取器,甚至可能找到一種方法在多個映射器之間「拆分」文件。這將允許您解決您的可擴展性問題。

爲了解決一些點你的問題:

  • 的NameNode只需要內存來存儲塊(名稱,塊[大小,長度,位置])的信息。假設你給它分配了一個體面的內存空間(GB),沒有理由不能在HDFS存儲中擁有容納PB數據的集羣(假設你有足夠的物理存儲空間)
+0

Chris,文件是TIFF包含許多邏輯記錄的文件。我們從TIFF文件中提取特定的元數據並將其轉換爲JSON。我相信我們必須閱讀整個文件。 –

+0

我假設邏輯記錄是http://en.wikipedia.org/wiki/Tagged_Image_File_Format#Multiple_subfiles –

+0

上描述的子文件。實際上,我們不需要擔心在這種情況下的子文件。 –