一、 概述
小檔案是指檔案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. 當使用者進行讀取操作時,可根據資料庫中的結果標誌來讀取檔案。
什麼是檔案?
這裡所要提及的檔案 file 是指計算機檔案。計算機檔案是以計算機硬碟為載體儲存在計算機上的資訊集合。檔案可以是文字文件 程式等等。檔案通常具有三個字母的副檔名,用於指示檔案型別 例如,檔案常常以 jpeg 格式儲存並且擴充套件名為 jpg 檔案有不同型別,在程式設計中,主要用到兩種檔案 1.程式檔...
什麼是HEX檔案
intel hex 檔案是由一行行符合intel hex檔案格式的文字所 構成的ascii文字檔案。在intel hex檔案中,每一行包含一 個hex記錄。這些記錄由 對應機器語言 碼和 或常量 資料的十六進製制 編碼數字 組成。intel hex檔案通常用於 傳輸將被存於rom或者eprom中的程...
什麼是 ocx 檔案
ocx是ocx控制項的副檔名,下來說說什麼是ocx控制項 說說什麼是ocx控制項?如果你用過visual basic或者delphi一類的視覺化程式設計工具,那麼對控制項這個概念一定不會陌生,就是那些工具條上的小按鈕,如editbox,grid,imagebox,timer等等。每個控制項都有自己的...