HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

一、概述

手機圖片或者像淘寶這樣的網站中的產品圖片特點:

(1)、大量手機用戶同時在線,執行上傳、下載、read等圖片操作

(2)、文件數量較大,大小一般爲幾K到幾十K左右

 

HDFS存儲特點:

(1)      流式讀取方式,主要是針對一次寫入,多次讀出的使用模式。寫入的過程使用的是append的方式。

(2)      設計目的是爲了存儲超大文件,主要是針對幾百MB,GB,甚至TB的文件

(3)      該分佈式系統構建在普通PC機組成的集羣上,大大降低了構建成本,並屏蔽了系統故障,使得用戶可以專注於自身的操作運算。

 

HDFS與小圖片存儲的共通點和相悖之處:

(1)      都建立在分佈式存儲的基本理念之上

(2)      均要降低成本,利用普通的PC機構建系統集羣

 

(1)      HDFS不適合大量小文件的存儲,因namenode將文件系統的元數據存放在內存中,因此存儲的文件數目受限於 namenode的內存大小。HDFS中每個文件、目錄、數據塊佔用150Bytes。如果存放1million的文件至少消耗300MB內存,如果要存 放1billion的文件數目的話會超出硬件能力

(2)      HDFS適用於高吞吐量,而不適合低時間延遲的訪問。如果同時存入1million的files,那麼HDFS 將花費幾個小時的時間。

(3)      流式讀取的方式,不適合多用戶寫入,以及任意位置寫入。如果訪問小文件,則必須從一個datanode跳轉到另外一個datanode,這樣大大降低了讀取性能。

 

二、HDFS文件操作流程

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

reading:

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

writing:

 HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

三、HDFS自帶的小文件存儲解決方案

對於小文件問題,hadoop自身提供了三種解決方案:Hadoop Archive、 Sequence File 和 CombineFileInputFormat

(1)      Hadoop Archive

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

    歸檔爲bar.har文件,該文件的內部結構爲:

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

 

創建存檔文件的問題:

1、存檔文件的源文件目錄以及源文件都不會自動刪除需要手動刪除

2、存檔的過程實際是一個mapreduce過程,所以需要需要hadoop的mapreduce的支持

3、存檔文件本身不支持壓縮

4、存檔文件一旦創建便不可修改,要想從中刪除或者增加文件,必須重新建立存檔文件

5、創建存檔文件會創建原始文件的副本,所以至少需要有與存檔文件容量相同的磁盤空間

(2)      Sequence File

sequence file由一系列的二進制的對組成,其中key爲小文件的名字,value的file content。,>

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

創建sequence file的過程可以使用mapreduce工作方式完成

對於index,需要改進查找算法

對小文件的存取都比較自由,也不限制用戶和文件的多少,但是該方法不能使用append方法,所以適合一次性寫入大量小文件的場景

(3)      CombineFileInputFormat

CombineFileInputFormat是一種新的inputformat,用於將多個文件合併成一個單獨的split,另外,它會考慮數據的存儲位置。

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

 

四、WebGIS解決方案概述

在地理信息系統中,爲了方便傳輸通常將數據切分爲KB大小的文件存儲在分佈式文件系統中,論文結合WebGIS數據的相關特徵,將相鄰地理位置的小 文件合併成一個大的文件,併爲這些文件構建索引。論文中將小於16MB的文件當做小文件進行合併處理,將其合併成64MB的block並構建索引。

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

從以上索引結構和文件存儲方式可以看出,index是一般的定長hash索引,並且採用的是存儲全局index文件的方式

read的過程是將小文件append到下文件後邊,然後更新索引的過程

delete文件的過程採用lazy模式,更改的是FVFlag,在空間重新分配的過程中,纔會根據該flag刪除文件。

 

五、BlueSky解決方案概述

BlueSky是中國電子教學共享系統,主要存放的教學所用的ppt文件和視頻文件,存放的載體爲HDFS分佈式存儲系統。在用戶上傳PPT文件的 同時,系統還會存儲一些文件的快照,作爲用戶請求ppt時可以先看到這些快照,以決定是否繼續瀏覽,用戶對文件的請求具有很強的關聯性,當用戶瀏覽ppt 時,其他相關的ppt和文件也會在短時間內被訪問,因而文件的訪問具有相關性和本地性。

paper主要提出了兩個基本觀點:

(1)      將屬於同一課件的小文件合併成一個大文件,從而減輕namenode的壓力,提高小文件的存儲效率

(2)      提出了一種兩級預取機制以提高小文件的讀取效率,(索引文件預取和數據文件預取)索引文件預取是指當用戶訪問某個文件時,該文件 所在的block對應的索引文件被加載到內存中,這樣,用戶訪問這些文件時不必再與namenode交互了。數據文件預取是指用戶訪問某個文件時,將該文 件所在課件中的所有文件加載到內存中,這樣,如果用戶繼續訪問其他文件,速度會明顯提高。

BlueSky上傳文件的過程:

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

BlueSky閱覽文件的過程:

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

文件合併:

文件合併過程如果合併之後文件的大小小於block64MB的大小則直接存放到一個block中。(合併之後的文件包括local index文件)

如果合併之後的文件大小大於64MB有兩種方式split這個大文件:

1、                 local index文件、ppt文件、standresolution picture series存放在一個block中,剩下的picture series存在在其他的block中。

2、                 在相鄰block的連接處填充空白文件,具體過程:

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

文件映射:

文件的命名方式,分離的預取圖片有其自身的命名方式,具體見paper。文件映射過程中,除了block中的局部索引文件之外,還有一個全局映像文 件。該文件存放的內容爲

根據全局mapping table 就可以根據merged file name 和 block Id到namenode上得到datanode的信息,然後到根據到具體的機器上找到相應的block獲取到localindex file,根據original file name從local index file中查到從而定位到data。根據預取策略,在此過程中也會預取到local index file 和相關的file,>

 

六、facebookHayStack解決方案概述

 HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

haystack是一個不同於HDFS的分佈式系統,如果想在HDFS的基礎上構建小文件存儲系統,個人認爲可以參考借鑑其索引結構的設計。

1、  directory 中有logical volume  id<->physicalvolume id。根據可以通過directory拼出來http:////id>/ 。 因此在directory端存在着映射以及映射,><>,>

2、  根據url到store端之後,可以根據logicalvolume id獲得相應的physical volume的位置,然後physical中存在super block,根據映射可以得到photo數據,>

七、TFS解決方案概述

http://code.taobao.org/p/tfs/src/

TFS(Taobao !FileSystem)是一個高可擴展、高可用、高性能、面向互聯網服務的分佈式文件系統,主要針對海量的非結構化數據,它構築在普通的Linux機器 集羣上,可爲外部提供高可靠和高併發的存儲訪問。TFS爲淘寶提供海量小文件存儲,通常文件大小不超過1M,滿足了淘寶對小文件存儲的需求,被廣泛地應用 在淘寶各項應用中。它採用了HA架構和平滑擴容,保證了整個文件系統的可用性和擴展性。同時扁平化的數據組織結構,可將文件名映射到文件的物理地址,簡化 了文件的訪問流程,一定程度上爲TFS提供了良好的讀寫性能。

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

TFS的塊大小可以通過配置項來決定,通常使用的塊大小爲64M。TFS的設計目標是海量小文件的存儲,所以每個塊中會存儲許多不同的小文 件。!DataServer進程會給Block中的每個文件分配一個ID(File ID,該ID在每個Block中唯一),並將每個文件在Block中的信息存放在和Block對應的Index文件中。這個Index文件一般都會全部 load在內存,除非出現!DataServer服務器內存和集羣中所存放文件平均大小不匹配的情況。

TFS中之所以可以使用namenode存放元數據信息的一個原因在於不像HDFS的元數據需要存放,filename與block id的映射以及block id與datanode的映射。在TFS中沒有file的概念,只有block 的映射信息。所有的小文件被拼接成block。所以namenode中只需要存放的映射以及的映射。這樣一來元數據信息就會減少很多,從而解決HDFS的namenode的瓶頸問題。

在TFS中,將大量的小文件(實際用戶文件)合併成爲一個大文件,這個大文件稱爲塊(Block)。TFS以Block的方式組織文件的存儲。每一 個Block在整個集羣內擁有唯一的編號,這個編號是由NameServer進行分配的,而DataServer上實際存儲了該Block。 在!NameServer節點中存儲了所有的Block的信息,一個Block存儲於多個!DataServer中以保證數據的冗餘。對於數據讀寫請求, 均先由!NameServer選擇合適的!DataServer節點返回給客戶端,再在對應的!DataServer節點上進行數據操 作。!NameServer需要維護Block信息列表,以及Block與!DataServer之間的映射關係,其存儲的元數據結構如下:

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

八、一種提高雲存儲小文件效率的解決方案

http://www.chinacloud.cn/show.aspx?&id=8105&cid=30

(美國西北太平洋國家實驗室2007年的一份研究報告表明,他們系統中有1 200萬個文件,其中94%的文件小於64 MB,58%的小於64 kB。在一些具體的科研計算環境中,也存在大量的小文件,例如,在某些生物學計算中可能會產生3 000萬個文件,而其平均大小隻有190 kB。)

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)

系統爲每個用戶建立了3種隊列:

序列文件隊列(SequenceFile queue,SFQ),

序列文件操作隊列(SequenceFile operation queue,SFOQ),

備用隊列(Backup queue,BQ)。

其中,SFQ用於小文件的合併,SFOQ用於對合並後小文件的操作,BQ用於操作的小文件數超過SFQ或SFOQ長度的情況。

HDFS小文件處理解決方案總結+facebook(HayStack) + 淘寶(TFS)


轉載自:http://www.open-open.com/lib/view/open1330605869374.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章