謝 帆 彭玉濤
(井岡山大學網絡信息中心,江西 吉安 343009)
面對海量大文件、小文件存儲混亂的問題,引入基于Hadoop分布式架構的云存儲系統、HBase數據庫,并提出海量小文件存儲的HPM優化方案。根據小文件體積不均勻、數量多的特征,通過創建不同類別的小文件索引,將MDS鏡像文件與文件名拼接成字符串,完成多個小文件合并設置,并采用Ehcache緩存框架對需要訪問的特定數據文件,緩存至云存儲平臺的客戶端中,能夠充分保證用戶在與Hadoop集群交互、重復信息訪問的效率,以及分布式數據存儲的可靠性、容錯性。
分布式存儲是將分布式文件系統,部署于多個分散的云服務器中,并采用ScaleOut橫向擴展架構,將不同的數據信息處理、存儲任務,分布到多個低成本的網絡節點,并可根據數據存儲的需求添加節點,來擴展云服務存儲容量、存儲功能。[1]外部客戶端可通過互聯網,接入到分布式存儲的云服務平臺之中,對任意時間、任意地點、任意數據對象的存儲行為,進行獨立存儲節點、數據存儲任務的配置,提供面向客戶端、按需的云存儲服務。
存儲虛擬化是指存儲設備虛擬化、存儲服務虛擬化、網絡虛擬化,目的在于通過硬件及應用虛擬化、數據封裝技術,解決不同計算機設備接口、存儲容量間的差異問題,使得用戶在數據信息處理、存儲過程中,無需考慮后臺的硬件配置、資源負載狀況。
在PC主機上設置虛擬化層,虛擬出應用軟件、虛擬存儲管理設備,并通過映像技術虛擬出CPU、I/O通訊接口,以及NAS、SAN等虛擬網絡存儲,在數據信息處理與存儲中共用同一傳輸信道,或者經由數據通道直接訪問存儲設備,實現底層硬件、上層存儲業務的互相耦合。
數據容錯技術為分布式云存儲的故障處理技術,包括復制性數據容錯、糾刪碼型數據容錯等內容。其中復制性數據容錯技術,是通過設置多個數據處理模塊,用于不同網絡節點的數據處理、存儲控制,當某一模塊損壞后可斷開或隔離該模塊,內部節點的其余模塊可正常運行,但缺點是復制性數據容錯技術需要建立副本,會占用大量的存儲硬件資源。糾刪碼型數據容錯技術、數據加密技術,則是采用存儲數據的編碼處理方式、TTL/SSL技術等進行編碼加密、解碼控制,用于防控外部用戶攻擊、病毒入侵,其占用的存儲硬件資源較少,但缺陷是編解碼過程對服務器設備的性能要求更高。
HadoopArchives作為數據文檔或文件的合并工具,通常利用MapReduce模型編程、HAR文件元數據信息設置與合并,完成小的數據文件處理、歸檔存儲等操作,并將歸檔后的文件添加至系統索引中。[2]如針對_index、_masterindex形式的小數據文件,可由HAR打包工具設置*.har的文件擴展名,其中包含了不同數據的文件名、位置等元數據信息,然后用part-*存放數據內容、用masterindex存放hashcode指針,歸檔處理后的har文件可壓縮和解壓,這樣能夠最大程度減少磁盤容量的占用。
SequenceFile與HAR的數據文件合并方案類似,是以[key value]鍵值對的二進制文件作為小文件合并的元數據信息處理方式,其中設置key為小文件名、value為小文件內容,以數據塊為單位進行序列化合并,將小文件數據切為split格式的片,作為MapReduce并行計算、存儲的輸入值,使小文件合并降低NameNode內存開銷。但缺陷是該文件格式不能建立索引,讀取時需遍歷整個源文件。因而這一數據文件合并方案,即使采取Block組織方式對key、value都進行壓縮,也難以滿足低延時隨機訪問的數據讀取需求。
為解決這一問題,本文給出HPM分級處理的小文件優化方案,采用HPM方案改進現有的HDFS分布式存儲架構,將其設置為包含用戶層、數據處理層、存儲層的多層結構,具體如圖1所示。

圖1 HPM方案改進的HDFS分布式存儲架構
其中HPM分級處理模塊位于數據處理層,該層級包含文件重復判定、文件大小判定、文件合并、緩存和預取等的子模塊,根據服務器/客戶機(C/S)模式傳輸的文件大小,HPM通過以上多個處理模塊,完成不同文件名稱字符串、MD5值的數據檢索分析,判定文件大小、是否存在重復,將小文件通過合并模塊的合并隊列、臨時隊列進行合并,使合并文件大小滿足系統數據塊的閾值要求,降低NameNode的內存開銷。同時,在索引子模塊中創建索引文件,在HBase數據庫中記錄臨時索引信息,將檢索的同一類型的小文件合并;在緩存和預取子模塊中,掃描數據文件的訪問次數,記錄訪問頻率更高的文件,并將該文件緩存于HDFS存儲端,以便于用戶端對數據文件的重復訪問和讀取。
在分布式存儲系統構建之前,需要利用各節點主機、VMWare虛擬機、Hadoop集群,進行完全分布式系統架構的環境部署。選用6臺PC機作為NameNode節點、DataNode節點、SecondaryNameNode節點的主機,分別命名為masterl、master2、slavel、……、slave4,各主機在不同節點上執行主機名修改,以及network-scripts目錄的ifcfg-eth0文件修改、靜態IP地址配置等任務,使Hadoop集群的多個節點名與節點IP地址相對應[3]。
而后對Hadoop分布式架構的Java編譯運行環境進行配置,設置由ssh管理的免密鑰登錄節點,設定各節點的數據存放目錄/opt/software、解壓目錄/opt/module,ssh免密鑰配置的執行流程為:$ssh-keygen-trsa;$cd/root/.ssh;$ssh-copy-idslavel~4,即輸入命令分別對應id_rsa.pub(公鑰)、id_rsa(私鑰)等文件,在master節點進入/root/.ssh目錄,將公鑰拷貝到可免密登錄的slavel、……、slave4節點,由此只需通過sshroot@slavel~4命令驗證,即可完成存儲節點設置。
Hadoop環境變量的配置需打開etc目錄,將profile文件的用戶名$LOGNAME/.profile、登錄目錄$HOME/.profile變量,添加到數據存儲的運行環境中,在profile文件末尾添加Hadoop路徑vim/etc/profile,保存退出。而后對masterl節點、slaves節點的環境變量進行設置,將jdk安裝路徑加入至masterl節點,添加slave節點的IP地址,修改Hadoop核心配置文件來完成節點IP和端口設置。
基于Hadoop分布式集群環境,構建用于數據處理、存儲的云服務管理系統,對系統內的文件大小、名稱、長度、合并偏移值等元數據信息,以及數據文件的存儲路徑進行科學規范管理[4]。云存儲系統模型的層次化組成結構,包括存儲層、數據管理層、應用接口層、用戶訪問層等層級,具體如圖2所示。

圖2 分布式存儲系統的組成架構
該分布式云存儲系統模型以B/S(瀏覽器/服務器)模式,作為用戶訪問、數據處理與存儲的功能實現方式,由應用服務器響應用戶登錄、文件上傳/下載的執行命令,Hadoop集群節點存儲大文件、小文件、合并文件。
存儲層為系統最底層,通常包含HDFS存儲器、Web服務器、存儲硬盤等設備;數據管理層借助于Hadoop分布式集群、存儲器裝置,設置多個網絡節點、虛擬出NAS、SAN存儲裝置,可提供數據讀取、寫入、瀏覽、刪除的功能服務。
應用接口層為系統的網絡連接層,包含API、webserver等接口,在數據接入、網絡信道傳輸過程中,由Web服務器控制用戶訪問請求、文件處理與存儲需求,安排Nginx反向代理向多個網絡節點分配負載,并將處理后的數據寫入至Hadoop集群、MySQL或HDFS存儲數據庫中。
用戶訪問層為系統最外層,由管理服務器分配與配置系統賬號、登錄密碼,展示用于用戶訪問控制的注冊、登錄等操作頁面。
網絡云平臺中的數據文件存儲設置,通常圍繞著用戶層、數據處理層、存儲層等系統層級,設置用于數據文件存儲的大小判定模塊、重復判定模塊、合并模塊、緩存及預讀寫模塊,分級完成多個小文件數據的連續處理[5]。
(1)文件大小判定的功能模塊。當前網絡傳輸、存儲數據文件大小的閾值設定,通常依照HDFS分布式文件存儲的標準,默認數據塊大小為64MB,小于64MB的存儲數據文件被稱為小文件,但這一文件閾值設定過高,將導致不必要的文件合并,過低又會增加合并后的小文件數量,因此本文設定小文件閾值為10MB。
(2)文件重復判定的功能模塊。數據文件傳輸的重復性判定,通常使用MDS信息摘要算法,對不定長度數據信息,處理為具有固定字符串長度的數據元組,并輸出由MDS算法處理后的結果A。當用戶客戶端上傳文數據件后,查看數據信息的MDS值是否存在于HBase數據庫中,若存在表明數據已被寫入、無需重復寫入,具體基于MDS算法的數據文件重復判定步驟如下:
第一,對數據長度為M的文件進行二進制數填充(包括1和n個0),直到字符串擴充為448+N*512(bit)的長度則停止填充。
第二,用64位字符串存儲填充前的數據信息長度,按照64位求余的結果,追加長度為448+N*512+64=(N+1)*512(bit)的數據序列。
第三,設置32位初始化鏈路變量A、B、C、D,對輸入數據分為字符串長度為512bit的信息塊,進行多輪線性函數循環運算,求解公式為lib=(ABC)T+(ABD)T+(ACD)T+(BCD)T,得到lib1、lib2……等的相加求和結果lib,作為MDS值。將MDS值與HBase數據庫中的文件名、文件內容字符串作對比,進行重復數據的篩除、過濾。
(3)文件合并的功能模塊。HDFS分布式存儲架構,可按照順序進行大文件的存取、合并,但在大量小文件的處理、合并方面性能較差,而對緩存區隊列設定閾值、遍歷小文件的方式,雖然能完成大部分主流小文件的處理、合并存儲操作,但以“文件體積”控制為主的合并,將造成合并后的數據體積不均、NameNode內存浪費問題。
根據以上數據文件大小判定標準,設定小文件閾值為10MB的體積最優模式,也即當傳輸文件體積大于10MB時不作處理,小于10MB時按照數據文件大小判定的要求,按照文件體積大小進行均勻分布,執行文件大小的判定算法(具體代碼如圖3所示)對其合并處理,并調用API接口上傳大文件至DataNode集群中存儲。這一基于體積最優的小文件合并算法,可最大化利用數據塊的存儲空間,避免合并小文件被分割、跨越數據塊存儲,降低NameNode節點的內存開銷。
文件大小的判定算法如下:

(4)文件索引、緩存的功能模塊。在HPM多處理器架構中,設置小文件讀取分級模塊、建立索引文件,使用HBase索引表、數據庫存儲臨時的索引文件信息,包括數據文件名、塊BlockID、存儲路徑、MDS值等的信息,以及合并后的小文件長度、偏移值信息。其中對不同類型的數據文件進行標記,大小數據文件分別記為flag=1、flag=0,合并文件記為flag=2,根據標記選擇數據讀取、索引的執行策略。
網絡數據小文件緩存的主要目的,在于方便HDFS分布式存儲系統的讀寫操作,也即“一次寫入、多次讀取”。依托于HBase索引表、HDFS分布式存儲器與I/O接口,可針對外部用戶客戶端訪問的NameNode請求,設置元數據文件的緩存機制、置換策略,響應請求后將大文件、合并文件的元數據信息,以及將小文件的文件名、長度和偏移值等信息,緩存到HDFS存儲器之中,當目標文件被訪問時,直接檢索HDFS存儲器的元數據信息即可[6]。這里小文件緩存信息與
分布式云存儲是基于多臺PC主機、服務器及數據庫,將網絡數據處理的任務程序,拆分為多個動態資源分配的小程序,為不同用戶分配動態的資源池,完成數據存儲的按需資源配置、功能擴展。因而對于不同數據信息的分布式云存儲,借助于Hadoop分布式架構、HDFS存儲器、HBase數據庫、PC主機、VMWare虛擬機等軟硬件設備,搭建起虛擬化云存儲服務平臺,提供分布式接入、全局訪問、虛擬化處理與存儲的服務,可完成對大小數據文件的分布式存儲、存儲虛擬化及數據容錯處理。