基於Hadoop Sequencefile的小檔案解決方案
基於Hadoop Sequencefile的小檔案解決方案
一、概述
小檔案是指檔案size小於HDFS上block大小的檔案。這樣的檔案會給hadoop的擴充套件性和效能帶來嚴重問題。首先,在HDFS中,任何block,檔案或者目錄在記憶體中均以物件的形式儲存,每個物件約佔150byte,如果有1000 0000個小檔案,每個檔案佔用一個block,則namenode大約需要2G空間。如果儲存1億個檔案,則namenode需要20G空間。這樣namenode記憶體容量嚴重製約了叢集的擴充套件。 其次,訪問大量小檔案速度遠遠小於訪問幾個大檔案。HDFS最初是為流式訪問大檔案開發的,如果訪問大量小檔案,需要不斷的從一個
二、Hadoop自帶的解決方案
對於小檔案問題,Hadoop本身也提供了幾個解決方案,分別為:Hadoop Archive,Sequence file和CombineFileInputFormat。
(1) Hadoop Archive
Hadoop Archive或者HAR,是一個高效地將小檔案放入HDFS塊中的檔案存檔工具,它能夠將多個小檔案打包成一個HAR檔案,這樣在減少
使用HAR時需要兩點,第一,對小檔案進行存檔後,原檔案並不會自動被刪除,需要使用者自己刪除;第二,建立HAR檔案的過程實際上是在執行一個mapreduce作業,因而需要有一個hadoop叢集執行此命令。
該方案需人工進行維護,適用管理人員的操作,而且har檔案一旦建立,Archives便不可改變,不能應用於多使用者的網際網路操作。
(2) Sequence file
sequence file由一系列的二進位制key/value組成,如果為key小檔名,value為檔案內容,則可以將大批小檔案合併成一個大檔案。
Hadoop-0.21.0
該方案對於小檔案的存取都比較自由,不限制使用者和檔案的多少,但是SequenceFile檔案不能追加寫入,適用於一次性寫入大量小檔案的操作。
(3)CombineFileInputFormat
CombineFileInputFormat是一種新的inputformat,用於將多個檔案合併成一個單獨的split,另外,它會考慮資料的儲存位置。
該方案版本比較老,網上資料甚少,從資料來看應該沒有第二種方案好。
三、小檔案問題解決方案
在原有HDFS基礎上新增一個小檔案處理模組,具體操作流程如下:
1. 當用戶上傳檔案時,判斷該檔案是否屬於小檔案,如果是,則交給小檔案處理模組處理,否則,交給通用檔案處理模組處理。
2. 在小檔案模組中開啟一定時任務,其主要功能是當模組中檔案總size大於HDFS上block大小的檔案時,則通過SequenceFile元件以檔名做key,相應的檔案內容為value將這些小檔案一次性寫入hdfs模組。
3. 同時刪除已處理的檔案,並將結果寫入資料庫。
4. 當用戶進行讀取操作時,可根據資料庫中的結果標誌來讀取檔案。
轉自:http://lxm63972012.iteye.com/blog/1429011