1. 程式人生 > >基於Hadoop Sequencefile的小檔案解決方案

基於Hadoop Sequencefile的小檔案解決方案

基於Hadoop Sequencefile的小檔案解決方案

一、概述

   小檔案是指檔案size小於HDFSblock大小的檔案。這樣的檔案會給hadoop的擴充套件性和效能帶來嚴重問題。首先,在HDFS中,任何block,檔案或者目錄在記憶體中均以物件的形式儲存,每個物件約佔150byte,如果有1000 0000個小檔案,每個檔案佔用一個block,則namenode大約需要2G空間。如果儲存1億個檔案,則namenode需要20G空間。這樣namenode記憶體容量嚴重製約了叢集的擴充套件。 其次,訪問大量小檔案速度遠遠小於訪問幾個大檔案。HDFS最初是為流式訪問大檔案開發的,如果訪問大量小檔案,需要不斷的從一個

datanode跳到另一個datanode,嚴重影響效能。最後,處理大量小檔案速度遠遠小於處理同等大小的大檔案的速度。每一個小檔案要佔用一個slot,而task啟動將耗費大量時間甚至大部分時間都耗費在啟動task和釋放task上。

二、Hadoop自帶的解決方案

對於小檔案問題,Hadoop本身也提供了幾個解決方案,分別為:Hadoop ArchiveSequence fileCombineFileInputFormat

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,包括WriterReaderSequenceFileSorter類進行寫,讀和排序操作。如果hadoop版本低於0.21.0的版本,實現方法可參見[3]

該方案對於小檔案的存取都比較自由,不限制使用者和檔案的多少,但是SequenceFile檔案不能追加寫入,適用於一次性寫入大量小檔案的操作。

3CombineFileInputFormat

CombineFileInputFormat是一種新的inputformat,用於將多個檔案合併成一個單獨的split,另外,它會考慮資料的儲存位置。

該方案版本比較老,網上資料甚少,從資料來看應該沒有第二種方案好。

三、小檔案問題解決方案

在原有HDFS基礎上新增一個小檔案處理模組,具體操作流程如下:

       1.   當用戶上傳檔案時,判斷該檔案是否屬於小檔案,如果是,則交給小檔案處理模組處理,否則,交給通用檔案處理模組處理。

       2.  在小檔案模組中開啟一定時任務,其主要功能是當模組中檔案總size大於HDFSblock大小的檔案時,則通過SequenceFile元件以檔名做key,相應的檔案內容為value將這些小檔案一次性寫入hdfs模組。

       3. 同時刪除已處理的檔案,並將結果寫入資料庫。

       4.  當用戶進行讀取操作時,可根據資料庫中的結果標誌來讀取檔案。


轉自:http://lxm63972012.iteye.com/blog/1429011