HDFS小文件問題及解決方案

1、  概述

小文件是指文件size小於HDFS上block大小的文件。這樣的文件會給hadoop的擴展性和性能帶來嚴重問題。首先,在HDFS中,任何block,文件或者目錄在內存中均以對象的形式存儲,每個對象約佔150byte,如果有1000 0000個小文件,每個文件佔用一個block,則namenode大約需要2G空間。如果存儲1億個文件,則namenode需要20G空間(見參考資料[1][4][5])。這樣namenode內存容量嚴重製約了集羣的擴展。 其次,訪問大量小文件速度遠遠小於訪問幾個大文件。HDFS最初是爲流式訪問大文件開發的,如果訪問大量小文件,需要不斷的從一個datanode跳到另一個datanode,嚴重影響性能。最後,處理大量小文件速度遠遠小於處理同等大小的大文件的速度。每一個小文件要佔用一個slot,而task啓動將耗費大量時間甚至大部分時間都耗費在啓動task和釋放task上。

本文首先介紹了hadoop自帶的解決小文件問題的方案(以工具的形式提供),包括Hadoop Archive,Sequence file和CombineFileInputFormat;然後介紹了兩篇從系統層面解決HDFS小文件的論文,一篇是中科院計算所2009年發表的,用以解決HDFS上存儲地理信息小文件的方案;另一篇是IBM於2009年發表的,用以解決HDFS上存儲ppt小文件的方案。

2、  HDFS文件讀寫流程

在正式介紹HDFS小文件存儲方案之前,我們先介紹一下當前HDFS上文件存取的基本流程。

(1)  讀文件流程

1)client端發送讀文件請求給namenode,如果文件不存在,返回錯誤信息,否則,將該文件對應的block及其所在datanode位置發送給client

2) client收到文件位置信息後,與不同datanode建立socket連接並行獲取數據。

(2) 寫文件流程

1) client端發送寫文件請求,namenode檢查文件是否存在,如果已存在,直接返回錯誤信息,否則,發送給client一些可用namenode節點

2) client將文件分塊,並行存儲到不同節點上datanode上,發送完成後,client同時發送信息給namenode和datanode

3)  namenode收到的client信息後,發送確信信息給datanode

4)  datanode同時收到namenode和datanode的確認信息後,提交寫操作。

3、  Hadoop自帶的解決方案

對於小文件問題,Hadoop本身也提供了幾個解決方案,分別爲:Hadoop Archive,Sequence file和CombineFileInputFormat。

(1) Hadoop Archive

Hadoop Archive或者HAR,是一個高效地將小文件放入HDFS塊中的文件存檔工具,它能夠將多個小文件打包成一個HAR文件,這樣在減少namenode內存使用的同時,仍然允許對文件進行透明的訪問。

對某個目錄/foo/bar下的所有小文件存檔成/outputdir/ zoo.har:

hadoop archive -archiveName zoo.har -p /foo/bar /outputdir

當然,也可以指定HAR的大小(使用-Dhar.block.size)。

HAR是在Hadoop file system之上的一個文件系統,因此所有fs shell命令對HAR文件均可用,只不過是文件路徑格式不一樣,HAR的訪問路徑可以是以下兩種格式:

har://scheme-hostname:port/archivepath/fileinarchive

har:///archivepath/fileinarchive(本節點)

可以這樣查看HAR文件存檔中的文件:

hadoop dfs -ls har:///user/zoo/foo.har

輸出:

har:///user/zoo/foo.har/hadoop/dir1

har:///user/zoo/foo.har/hadoop/dir2

使用HAR時需要兩點,第一,對小文件進行存檔後,原文件並不會自動被刪除,需要用戶自己刪除;第二,創建HAR文件的過程實際上是在運行一個mapreduce作業,因而需要有一個hadoop集羣運行此命令。

此外,HAR還有一些缺陷:第一,一旦創建,Archives便不可改變。要增加或移除裏面的文件,必須重新創建歸檔文件。第二,要歸檔的文件名中不能有空格,否則會拋出異常,可以將空格用其他符號替換(使用-Dhar.space.replacement.enable=true 和-Dhar.space.replacement參數)。

(2) Sequence file

sequence file由一系列的二進制key/value組成,如果爲key小文件名,value爲文件內容,則可以將大批小文件合併成一個大文件。

Hadoop-0.21.0中提供了SequenceFile,包括Writer,Reader和SequenceFileSorter類進行寫,讀和排序操作。如果hadoop版本低於0.21.0的版本,實現方法可參見[3]。

(3)CombineFileInputFormat

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

4、  小文件問題解決方案

上一節中提到的方案均需要用戶自己編寫程序,每隔一段時間對小文件進行merge以便減少小文件數量。那麼能不能直接將小文件處理模塊嵌到HDFS中,以便自動識別用戶上傳的小文件,然後自動對它們進行merge呢?

本節介紹了兩篇論文針試圖在系統層面解決HDFS小文件問題。這兩篇論文對不同的應用提出瞭解決方案,實際上思路類似:在原有HDFS基礎上添加一個小文件處理模塊,當一個文件到達時,判斷該文件是否屬於小文件,如果是,則交給小文件處理模塊處理,否則,交給通用文件處理模塊處理。小文件處理模塊的設計思想是,先將很多小文件合併成一個大文件,然後爲這些小文件建立索引,以便進行快速存取和訪問。

論文[4]針對WebGIS系統的特點提出瞭解決HDFS小文件存儲的方案。WebGIS是結合web和地理信息系統(GIS)而誕生的一種新系統。在WebGIS中,爲了使瀏覽器和服務器之間傳輸的數據量儘可能地少,數據通常被切分成KB的小文件存儲在分佈式文件系統中。論文結合WebGIS中數據相關性特徵,將保存相鄰地理位置信息的小文件合併成一個大的文件,併爲這些小文件建立索引以便對小文件進行存取。

該論文將size小於16MB的文件當做小文件,需將它們合併成64MB(默認的block size),並建立索引,索引結構和文件存儲方式見上圖。索引方式是一般的定長hash索引。

論文[5]針對Bluesky系統(http://www.bluesky.cn/)的特點提出瞭解決HDFS小文件存儲的方案。Bluesky是中國電子教學共享系統,裏面的ppt文件和視頻均存放在HDFS上。該系統的每個課件由一個ppt文件和幾張該ppt文件的預覽快照組成。當用戶請求某頁ppt時,其他相關的ppt可能在接下來的時間內也會被查看,因而文件的訪問具有相關性和本地性。本文主要有2個idea:第一,將屬於同一個課件的文件合併成一個大文件,以提高小文件存儲效率。第二,提出了一種two-level prefetching機制以提高小文件讀取效率,即索引文件預取和數據文件預取。索引文件預取是指當用戶訪問某個文件時,該文件所在的block對應的索引文件被加載到內存中,這樣,用戶訪問這些文件時不必再與namenode交互了。數據文件預取是指用戶訪問某個文件時,將該文件所在課件中的所有文件加載到內存中,這樣,如果用戶繼續訪問其他文件,速度會明顯提高。

下圖展示的是在BlueSky中上傳文件的過程:

下圖展示的是在BlueSky中閱覽文件的過程:

5、  總結

Hadoop目前還沒有一個系統級的通用的解決HDFS小文件問題的方案。它自帶的三種方案,包括Hadoop Archive,Sequence file和CombineFileInputFormat,需要用戶根據自己的需要編寫程序解決小文件問題;而第四節提到的論文均是針對特殊應用提出的解決方案,沒有形成一個比較通用的技術方案。

6、  參考資料

(1)有關小文件問題的表述:

http://www.cloudera.com/blog/2009/02/the-small-files-problem/

(2)Hadoop Sequence file:

http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/io/SequenceFile.html

(3)英文書籍《Hadoop:The Definitive Guide》,第七章190頁

(4)Xuhui Liu, Jizhong Han, Yunqin Zhong, Chengde Han, Xubin He: Implementing WebGIS on Hadoop: A case study of improving small file I/O performance on HDFS. CLUSTER 2009: 1-8

(5)Bo Dong, Jie Qiu, Qinghua Zheng, Xiao Zhong, Jingwei Li, Ying Li. A Novel Approach to Improving the Efficiency of Storing and Accessing Small Files on Hadoop: A Case Study by PowerPoint Files. In Proceedings of IEEE SCC’2010. pp.65~72


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