馬東,邵維專
(四川大學計算機學院,成都 610065)
隨著大數據時代的到來,傳統的文件系統已經無法應對新時代下的大數據存儲的挑戰,分布式文件系統以其高可靠性、高性能以及強大的可擴展性逐漸得到廣泛的使用。在主流的分布式文件系統中,大都采用元數據和文件數據分離的策略,將元數據信息存放在單獨的服務器上,元數據服務器作為整個分布式文件系統的管理節點,為應用提供文件系統目錄視圖和數據定位服務。
作為大數據平臺Hadoop的存儲核心,HDFS以其良好的設計和性能逐漸成為大數據處理方向的一個標準,Hadoop2.0引入主備模式,使用StandBy NameNode作為Active NameNode的熱備節點,由于整個文件系統的元數據全部存放在NameNode的內存中,當使用主備模式對NameNode進行同步備份時備份服務器需要與主NameNode同等配置,但是備份服務器并不對外提供讀寫服務,只是將同步應用Active NameNode的日志信息,文獻表明,在一個常規的HDFS分布式文件系統中,元數據寫操作僅占據所有元數據操作的5%左右,因此本文提出了一個StandBy NameNode元數據分級存儲策略,將寫操作較少的目錄的元數據信息序列
HDFS由元數據管理節點NameNode和數據節點DataNode組成,NameNode負責管理整個分布式文件系統的元數據信息,包括目錄樹以及各個數據塊對應的存儲信息,所有的存儲數據分散到DataNode上,當需要訪問文件時,應用首先需要訪問NameNode獲得文件的存儲信息,再訪問DataNode獲取文件數據。
我們把NameNode管理的文件系統目錄樹稱之為第一關系鏈,將NameNode中數據塊與對應的DataNode的關系稱之為第二關系鏈,HDFS使用FsIm?age以及EditLog文件中保存第一關系鏈的數據信息,第二關系鏈的建立依賴于NameNode啟動時由各個DataNode節點匯報得到。在一個小型的HDFS文件系統中,有10M文件,0.3M目錄以及13M數據塊,元數據占用了約9G內存?;酱疟P,這樣在保持主備完全同步的情況下可以極大降低StandBy NameNode內存的使用率。
現有的分布式文件系統往往采用元數據和數據的分離存儲,元數據訪問與典型的數據訪問不同,元數據往往較小,因此通常使用將元數據存放在內存中。大量研究表明,當數據剛被存放到存儲系統中時,對數據的修改和訪問會十分頻繁,但是隨著時間的推移,這些數據的訪問頻率會越來越低,甚至不再被訪問,這些數據往往占總數據量的80%以上。文獻[1]指出文件系統的變化具有顯著的空間局部性,在其對兩個企業級網絡文件服務器三個月的日志分析顯示,超過92%的元數據變化簇集在低于10%的目錄中;文獻[2]統計了Spotify的HDFS集群的元數據操作,指出在Hadoop典型應用產生的負載中,寫操作約占所有元數據操作的5%;基于此,本文提出了一種StandBy NameNode上元數據分級存儲算法。
NameNode作為HDFS的核心,使用主備模式保證HDFS的高可用,并在主備機上應用相同的日志序列保證Active NameNode和StandBy NameNode的一致性,Active NameNode處理集群的讀寫請求,StandBy Na?meNode同步應用寫操作的日志,考慮到大數據應用的特點和元數據變化的局部性,僅在StandBy NameNode內存中存放修改熱度較高的目錄,將熱度較低的目錄序列化后存儲在本地。
本文在HDFS的INodeDirectory結構中添加了int editIndicator作為目錄修改熱度值,考慮到文件系統目錄的修改特征,建立了一個層級的衰減模型。本文定義editIndicator的第0~1bit存儲熱度衰減標識,使用第2~31位記錄當前目錄的熱度值,將第2位作為該目錄的w位,同樣,衰減標識為01,10,11的w位分別為ed?itIndicator的第 23,15,7位,當目錄被修改時,會將路徑上目錄對應的w位置1。

圖1 熱度字段存儲結構
(1)衰減標識
目錄的熱度衰減分為四個級別,當目錄被創建時,級別設置為0,即衰減標識置為00,并設置當前級別的W位為1,當目錄被壓縮線程訪問時,會根據當前的衰減標識適用對應的衰減算法并降低當前的目錄熱度,熱度低于閾值后序列化和存儲該目錄。在需要加載目錄樹時,提升INodeLinked節點到被修改目錄路徑上目錄的熱度衰減級別。
(2)熱度衰減算法
老化算法:當壓縮線程訪問該目錄時,將該目錄的熱度衰減一半。
遞減算法:當壓縮線程訪問該目錄時,將該目錄的熱度降低1。

表1 熱度衰減策略分類表
(1)節點替換
當存在子樹的熱度過低時,使用INodeLinked節點替換該子樹根節點,然后將子樹序列化,INodeLinked保存了該子樹的序列化信息,其結構定義如下:

其中filePath為保存該子樹信息的文件存儲路徑。
(2)子樹序列化
考慮到NameNode元數據的組織形式,本文將目錄和該目錄下文件和子目錄的關系抽離單獨保存,使用DirEntry序列化目錄與該目錄下文件和子目錄的映射關系,其結構如下:


HDFS NameNode使用INodeMap保存所有目錄和文件的元數據。HDFS中文件(INodeFile)和目錄(IN?odeDirectory)都是INode的子類,因此定義了INode?Common用以序列化文件和目錄信息。INodeCommon
數據結構如下:

本文使用INodeLinked保存子樹的序列化信息,然后將子樹元數據信息存儲到文件中,文件的結構如表2所示。

表2 文件存儲結構
其中,treeId為子樹Id,INodeMapSection存放所有的INode信息,DirEntrySection存放所有的DirEntry信息,在序列化子樹或目錄時采用預分配空間的方法,每個文件預分配256KB大小,其中16KB作為DirEntry?Section,,其余空間作為INodeMapSection,為防止過多的文件創建,使FILE_MIN_INODE_COUNT限制每個文件最少需要保存的INode個數。當需要從文件加載子樹時,首先加載INodeMapSection,將其INode放入InodeMap中,然后加載DirEntrySection重建目錄子樹。
每隔時間T或者內存使用量達到一定閾值時啟動壓縮線程遍歷目錄樹,將熱度較低的目錄序列化存儲到本地,算法流程如圖2所示。

圖2 目錄遍歷算法
定義1兄弟節點:目錄或子樹根節點所在的父目錄包含的其他子目錄稱為該目錄的兄弟節點。
定義2可序列化:當一個子樹或目錄的熱度低于某一設定的閾值,則稱該子樹或目錄是可序列化的。
定義3可合并的:如果一個INodeLinked節點的剩余空間可以存放可序列化的兄弟節點或父節點的信息,則稱該INodeLinked節點是可合并的。
定義4最小序列化條件:當需要序列化的目錄或子樹的INode數量大于FILE_MIN_INODE_COUNT,則稱該子樹或目錄滿足最小序列化條件。
定義5孤立節點:若一個子樹或目錄滿足最小序列化條件,且父目錄是非可序列化的以及不存在可序列化的兄弟節點或者可合并的INodeLinked兄弟節點,則稱之為孤立節點。
定義6不可約減節點:如果某一個可序列化目錄或子樹包含的所有INodeLinked節點均滿足1)存在兄弟節點,該節點與兄弟節點是不可合并的,2)不存在兄弟節點,該節點與父目錄時不可合并的,則稱該目錄或子樹時不可約減節點。
若當前目錄或子樹是孤立節點,根據其INode個數分配存儲空間,空間分配策略如下:
(1)若當前子樹INode個數count小于1024,則分配256KB空間,DirEntrySection占用16KB
(2)若當前子樹INode個數count大于1024,則分配((count-1)/1024+1)*256K空間,DirEntrySection占用((count-1)/1024+1)*16K
子樹合并策略如下:
(1)對cdl隊列中的目錄進行約減:若該目錄子樹存在INodeLinked節點,則INodeLinked節點合并其兄弟節點以及父節點,直至該目錄子樹成為不可約減節點或INodeLinked節點,若該節點約減后成為IN?odeLinked節點,則將其加入existLinked隊列。
(2)將existLinked中節點與cdl隊列中的約減后的目錄進行合并,直至cdl中沒有可以并入existLinked的目錄。
(3)將cdl剩余的目錄子樹合并作為孤立節點,按照空間分配策略分配存儲空間。
本文使用三臺虛擬機搭建了測試集群,其中兩臺作為Active NameNode和StandBy NameNode,配置為1核CPU,2G內存,20G硬盤,三臺虛擬機均配置為Jour?nalNode和DataNode,NameNode中JVM內存配置為-Xms256M-Xmx1024M,使用測試程序隨機創建了約400萬空文件,并隨機標記約20%的目錄為熱點目錄,本文設定 FILE_MIN_INODE_COUNT為 20,同時在
參考文獻:StandBy NameNode啟動壓縮線程。
由圖3可以看出,在啟動壓縮線程之后,StandBy NameNode的堆內存使用明顯降低。

圖3 主備NameNode堆內存使用
本文針對StandBy NameNode內存占用高但是活躍元數據比例很低的問題,研究了HDFS元數據管理策略,提出了一種分級熱度衰減策略,實現了StandBy NameNode元數據的分級存儲算法,將StandBy Na?meNode的非活躍元數據壓縮存儲到本地,大大降低了其內存使用,同時使用初步的實驗驗證了算法的有效性。
[1]劉立坤.海量文件系統元數據查詢方法與技術[D].清華大學,2011.
[2]Niazi S,Ismail M,Grohsschmiedt S,et al.HopsFS:Scaling Hierarchical File System Metadata Using NewSQL Databases[J],2017.
[3]孫耀,劉杰,葉丹,等.分布式文件系統元數據服務的負載均衡框架[J].軟件學報,2016,27(12):3192-3207.
[4]李靜.基于訪問熱度分類的元數據副本技術研究[D].華中科技大學,2016.
[5]陳濤,肖儂,劉芳.對象存儲系統中自適應的元數據負載均衡機制[J].軟件學報,2013(2):331-342.
[6]Haohui Mai,Scaling Out the Namespace Using KV Store.https://issues.apache.org/jira/browse/HDFS-8286.
[7]曾衛進.基于HDFS的分級存儲功能設計與實現[D].華中科技大學,2016.