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