基於hadoop sequencefile的小檔案解決方案
一、概述
小檔案是指檔案
size
小於hdfs
上block
大小的檔案。這樣的檔案會給
hadoop
的擴充套件性和效能帶來嚴重問題。首先,在
hdfs
中,任何
block
,檔案或者目錄在記憶體中均以物件的形式儲存,每個物件約佔
150byte
,如果有
1000 0000
個小檔案,每個檔案占用乙個
block
,則namenode
大約需要
2g空間。如果儲存
1億個檔案,則
namenode
需要20g
空間。這樣
namenode
記憶體容量嚴重制約了集群的擴充套件。
其次,訪問大量小檔案速度遠遠小於訪問幾個大檔案。
hdfs
最初是為流式訪問大檔案開發的,如果訪問大量小檔案,需要不斷的從乙個
datanode
跳到另乙個
datanode
,嚴重影響效能。最後,處理大量小檔案速度遠遠小於處理同等大小的大檔案的速度。每乙個小檔案要占用乙個
slot
,而task
啟動將耗費大量時間甚至大部分時間都耗費在啟動
task
和釋放task上。
二、hadoop自帶的解決方案
對於小檔案問題,
hadoop
本身也提供了幾個解決方案,分別為:
hadoop archive
,sequence file
和combinefileinputformat。
(1)hadoop archive
hadoop archive
或者har
,是乙個高效地將小檔案放入
hdfs
塊中的檔案存檔工具,它能夠將多個小檔案打包成乙個
har檔案,這樣在減少
namenode
記憶體使用的同時,仍然允許對檔案進行透明的訪問。 使用
har時需要兩點,第一,對小檔案進行存檔後,原檔案並不會自動被刪除,需要使用者自己刪除;第二,建立
har檔案的過程實際上是在執行乙個
mapreduce
作業,因而需要有乙個
hadoop
集群執行此命令。
該方案需人工進行維護,適用管理人員的操作,而且
har檔案一旦建立,
archives
便不可改變,不能應用於多使用者的網際網路操作。 (
2)sequence file
sequence file
由一系列的二進位制
key/value
組成,如果為
key小檔名,
value
為檔案內容,則可以將大批小檔案合併成乙個大檔案。
hadoop-0.21.0
中提供了
sequencefile
,包括writer
,reader
和sequencefilesorter
類進行寫,讀和排序操作。如果
hadoop
版本低於
0.21.0
的版本,實現方法可參見
[3]。
該方案對於小檔案的訪問都比較自由,不限制使用者和檔案的多少,但是
sequencefile
檔案不能追加寫入,適用於一次性寫入大量小檔案的操作。
(3)combinefileinputformat
combinefileinputformat
是一種新的
inputformat
,用於將多個檔案合併成乙個單獨的
split
,另外,它會考慮資料的儲存位置。
該方案版本比較老,網上資料甚少,從資料來看應該沒有第二種方案好。
三、小檔案問題解決方案
在原有hdfs基礎上新增乙個小檔案處理模組,具體操作流程如下:
1. 當使用者上傳檔案時,判斷該檔案是否屬於小檔案,如果是,則交給小檔案處理模組處理,否則,交給通用檔案處 理模組處理。
2. 在小檔案模組中開啟一定時任務,其主要功能是當模組中檔案總size大於hdfs上block大小的檔案時,則通 過sequencefile元件以檔名做key,相應的檔案內容為value將這些小檔案一次性寫入hdfs模組。
3. 同時刪除已處理的檔案,並將結果寫入資料庫。
4. 當使用者進行讀取操作時,可根據資料庫中的結果標誌來讀取檔案。
hadoop自帶的訪問小檔案訪問解決方案
現實場景 在 系統中,存在大量的小檔案訪問,比如檔案,一般在幾m以內,1 但是hdfs預設block大小是64m,如果直接訪問在hadoop中,將極大的消耗namenode的資源。直接放在hadoop檔案系統中,大多只是做歸檔分析用,所以,我們就想能不能定期歸檔。2 放在hbase中,由於hbase...
Hadoop小檔案帶來的問題以及解決方案
小檔案指的是那些size比hdfs的block size 預設64m 小的多的檔案。hadoop適合處理少量的大檔案,而不是大量的 小檔案。首先,在hdfs中,任何block,檔案或者目錄在記憶體中均以物件的形式儲存,每個物件約佔150byte,如果有1000 0000個小檔案,每個檔案占用乙個bl...
HDFS小檔案問題及解決方案
1 概述 小檔案是指檔案size小於hdfs上block大小的檔案。這樣的檔案會給hadoop的擴充套件性和效能帶來嚴重問題。首先,在hdfs中,任何block,檔案或者目錄在記憶體中均以物件的形式儲存,每個物件約佔150byte,如果有1000 0000個小檔案,每個檔案占用乙個block,則na...