屈美娟 付良廷



摘要:大數據給各行業帶來新的發展機遇,面對各種復雜數據處理需求,高效的數據存儲是影響大數據應用的重要因素,不僅決定了數據寫入效率,還會影響數據讀取。文章提出一種基于HDFS的寫預處理存儲系統,針對大數據應用中復雜數據寫請求,使用聚類策略和文件拆分算法,對文件進行預處理,同時提高數據讀取效率。通過仿真實驗表明,能有效提高文件存儲的寫吞吐。
關鍵詞:存儲;大數據;寫緩存
中圖分類號:TP311.13 文獻標志碼:A 文章編號:2095-2945(2019)12-0140-03
1概述
以互聯網發展為依托的人工智能和物聯網技術,在改變生活方式的同時,也帶來了數據規模的持續攀升,加速了數據集的增長態勢。據統計,Baidu搜索引擎需要每天處理數據集達100PB,Facebook每天新增600TB數據。如何對這種超大規模數據進行有效存儲和高效查詢,已經成為人工智能和物聯網應用的各行業普遍面臨的突出問題。如何構建一套應用于大數據存儲系統,能夠在存儲性能、功能、穩定性、易用性等方面均有良好表現,是大數據存儲與管理面臨的重要問題。
本文在借鑒現有研究的基礎上,提出一種基于HDFS的寫緩存存儲系統,該系統在HDFS存儲上層構建寫緩存層,在該層中對客戶端發出的寫請求文件進行預處理工作,以形成固定大小文件,來簡化存儲過程,提高存儲效率。在預處理階段,依據數據訪問關聯度和關鍵字分組策略構建預處理算法,按照存儲標準文件大小,對文件進行預處理,以形成固定文件大小,一方面提高存儲效率,另一方面,便于還原原始文件,減少后期文件查詢的時間和系統開銷。
2設計思想
在大數據存儲系統中,面對不同大小文件復雜存儲請求,系統應能夠靈活針對各自特點選擇合適的存儲策略,一方面提高存儲性能,另一方面優化文件存儲管理和訪問。在大數據應用中,文件類型和文件大小豐富多樣,但歸根結底都是以文件形式存儲的。本文將針對文件存儲系統設計基于HDFS寫緩存預處理的大數據存儲系統,在數據寫入HDFS前,先經過預處理層,以合理組織元數據,提高數據寫入效率和訪問性能。寫緩存層具體設計組成如圖1所示。
寫緩存層包括一個主節點(Master)、文件合并模塊(C-Chunkserver)、文件拆分模塊(S-Chunkserver)。主節點硬件設置為高性能讀寫服務器,負責監聽客戶寫文件請求、分配緩存節點、管理元數據,根據負載情況分配預處理節點,同時記錄元數據。分配緩存節點包括兩部分:主節點和備份節點,主節點對數據進行預處理,副節點完成數據異步備份??蛻舭l出數據寫入請求后,Master根據文件大小依據預處理策略,選擇文件拆分或合并模塊分配預處理節點,預處理完成后存入緩存模塊中,再采用多線程寫入HDFS中。
3實現算法
3.1小文件聚類策略
對于小文件寫入HDFS,要進行聚類合并。本文使用聚類策略為MFCR(Most Frequent Conbin Read)最常讀取組合策略,基本思想為,由Master維護一個n*n二維表MFCR表,其中n為最常讀取數據的客戶機個數,用這個二維表來記錄客戶機數據組合查詢情況。文件合并模塊中每個主機設置一個標志信息,標識目前該主機目前已緩存數據客戶機編號。二維表中各CR系數(Conbin Read)初始化為0,當查詢結果來自客戶機s和客戶機t時,執行CRst=CRst+1操作。當緩存層Master監聽到來自客戶主機a發出的寫文件請求時,判斷文件為小文件需要合并后,同時遍歷MCR系數表并詢問各chunkserver狀態,找到最大CRab,其中b為chunksever中目前待合并數據客戶主機編號,將該chunksever編號返回給主機a,建立a主機與該chunksever連接,開始傳輸合并數據。在系統初始階段,MFCR表值為空,此時有客戶機發出數據存儲請求后,根據負載情況分配主機。
3.2大文件拆分算法
對于結構化的大數據,需要將數據拆分為若干個子表,以方便后期管理維護和查詢等。當主節點接收到結構化數據的寫請求后,由主節點中數據拆分模塊完成數據分解,根據負載情況分配存儲副本節點,再由副本節點執行遞歸算法,對文件大小進行二次判斷,對超出閾值的文件進行二次分解,直至所有文件大小在寫入緩存閾值范圍內,最后由各副本節點異步寫入緩存。本設計中對于結構化大數據拆分,采用基于列存儲的關鍵字分組策略。設置數據集為D,用于分組的關鍵字組合為K={K1,K2……Kn},分組時,先依據K1對數據集劃分,然后依據K2取值不同在K1分組的基礎上繼續分組,以此類推,直至分組結束。分組過程如下:
(1)設置分組基數g和分組系數入i,兩者乘積得到每個關鍵字分組數量gi。根據查詢頻率,為總表中每個關鍵字制定分組系數,用來確定每個關鍵字分組個數,應用于查詢頻率越高,分組系數越高,基于改關鍵字的分區粒度越細。
(2)獲取分組邊界值。確定基于第ki關鍵字分組數目之后,需確定各組之間取值范圍,根據ki關鍵字的不同取值,將數據集劃分為gi組數據。
如何確定分組邊界值,是決定合理拆分數據的關鍵因素。為了提高分組效率并減少分組工作系統開銷,采用隨機采樣的方法,來確定分組區間邊界值。取樣過程類似滑動窗口,過程如下:
(1)根據數據集和寫入HDFS標準文件大小,確定抽樣記錄數量Stotal。
(2)確定抽樣點個數Sgroup,即滑動窗口滑動次數。
(3)確定每個抽樣點附近抽樣記錄數量Sno,即滑動窗口寬度,則三個數量之間關系為Sno=Stotal/Sgroup。
(4)在0和數據集記錄總數之間獲取Sgroup個隨機值。
(5)以每個隨機值為起點,讀取Sno條記錄,讀取每個記錄的各個關鍵字取值,取樣完成后形成的采樣二維表,將具有Stotal條記錄,每條記錄包含分組關鍵字{K1,K2……Kn}的n個值。
(6)對采樣二維表每列數據執行:排序并確定gi-1個分組邊界值。舉例,假如取樣總數Stotal=12,對于K3關鍵字取值g3=4,則分組邊界值選取過程如圖2所示。
使用分組邊界值,依據數據集中記錄ki取值,對數據進行分組。i取值從1至n,完成整個數據集初步分組。
(7)對于完成初步分組的數據子集組合{D1,D2……DT},其中T=∏in=1gi,使用遞歸算法使所有拆分后文件都滿足寫入緩存文件大小要求,遞歸算法執行過程為:若存在Dt文件大于標準文件,則按照標準文件大小截取數據子集前面部分為Dt,剩余部分標記為Dt+1,然后再對Dt+1進行判斷,直至所有文件大小符合寫要求。
4實驗分析
本次仿真實驗目的是比較直接寫入HDFS和使用寫緩存層的HDFS兩種方法下,以標準文件大小為準,設定多組不同大小文件大小,比較兩種存儲系統寫吞吐對比。仿真實驗環境搭建方式為20臺仿真主機作為客戶端發送數據,1臺仿真服務器作為Master,合并和拆分預處理模塊分別使用10仿真主機,20仿真主機作為HDFS存儲。
4.1小文件寫入測試
實驗數據分別由客戶端發送大小為10KB-500KB文件寫請求,每次發送文件總數目設置為100000個,來進行仿真實驗測試。在此情況下,對比本設計和直接寫入HDFS寫吞吐對比,實驗結果數據如圖3所示。
通過實驗結果可以看到,本系統在處理小文件方面性能較好,但隨著文件增大,當文件超過一定閾值(1MB)后,寫入速度會出現瓶頸,這是因為在處理非結構化數據的時候,本設計中的寫緩存層在花費系統開銷再存入HDFS并沒有減少寫入時間,沒有發揮出寫緩存的作用。
從圖中可以看出,直接使用HDFS存儲時,隨著文件增大,寫入文件耗時也增大,當文件增大到一定程度時,所耗費時間急速增長,對于較大文件寫入時間較長。在對文件進行拆分處理后再存儲,消耗時間也隨著文件增大而延長,但增長速度較緩慢。同時,當文件較小時,由于分組會帶來系統開銷,因此降低了效率。從圖中可看到,30GB文件存儲時間大于40GB文件,這是由于本次試驗分組參數設置導致。
5結束語
本文提出一種基于HDFS的存儲方法,針對大數據應用中不同數據特點,提出針對性存儲策略,對于小文件應用基于訪問關聯度的聚類策略,對大數據提出基于列存儲的關鍵字分組策略,同時采用多線程寫入數據,提高了數據整體寫入速度。