蔡宇昂,張鑫
(1.湖北警官學院,湖北 武漢 430034;2.華中科技大學,湖北 武漢 430074)
為適應大數據對于存儲系統的要求,人們提出了許多分布式文件系統,分布式文件系統HDFS就是其中之一。在分布式系統Hadoop中,由于SSD(Hard Disk Driver,HDD)的不對稱I/O特性和價格因素,使得由SSD和HDD組成混合存儲系統是一種有效的解決方案。HDFS是針對同構集群設計的,對存儲介質的類型未加以區分,在為數據塊分配存儲空間和保存數據塊的過程中,不考慮存儲介質之間的性能差異,導致新型存儲介質的優勢無法完全的發揮出來。對HDFS的數據分布進行優化、提高HDFS的數據存取速度具有重要意義。
論文根據數據被讀寫的頻率確定數據應存放的存儲介質,解決數據在不同讀寫性能的存儲介質間的分布與其熱度無關的問題,期望能為大數據在高效存取與處理、多種數據及多種應用并存且并發服務等方面提供一些解決方案。在對數據分布策略進行優化之前將分析各類數據的時間和空間訪問特征,將其與多種特性的存儲設備關聯,達到將數據存儲在最合適的位置的目的,使之能夠被快速地獲取和存儲。
基于負載訪問的數據管理策略在發揮SSD優良讀性能的同時借助磁盤來減少對SSD的寫和擦除操作[1,2],系統通常采用靜態或動態監測的方法對頁面訪問情況進行統計,當訪問負載變化較為頻繁時,I/O 統計帶來的累積效應將會使該模型在訪問負載變化時不能快速反應,文獻[3]對此進行了改進,提出了一種時間敏感的SSD和HDD高效混合存儲模型。但是這兩種方法都是基于內存頁的I/O統計信息來決定數據分布,一方面當數據量和內存增大時所需的元數據迅速增加,不能滿足大數據數據量大的需求;另一方面在頁級別難以利用各請求之間的相關性來加速存儲性能,難以很好地支持大數據高效處理。MapReduce框架還為另一種異構計算平臺做了改進,比如多核處理器和核加速器,很多文章優化了同構集群下多租戶MapReduce工作,這些文章無論用哪種方式都是提出調度程序在面臨多重工作時讓本地任務的優先級高于遠程任務,但是在異構集群中,這些方法都不太適用。有論文提出一種稱為Tarazu的解決方案[4],對異構集群下的MapReduce系統進行了優化,但其所做的優化主要是針對任務調度方面,并未對異構集群下數據的存取方式進行改進?,F有國內外研究在大規模分布式存儲、數據分布與存儲性能隔離等問題上都提供了充足的解決方案,但是大數據環境下需要合理分布數據以獲得更高的訪問效率,數據在異構的存儲集群上的合理分布問題有待進一步研究。
HDFS集群中具體執行數據存儲邏輯功能的從節點都會駐留一個數據節點(DataNode)的守護進程,來執行分布式文件系統中的數據塊操作。DataNode會將HDFS數據塊保存在Linux本地文件系統的實際文件中,并將其視為Linux文件系統上的普通文件進行管理。在原HDFS中,DataNode在接收到數據塊后,會在本地文件系統中隨機選擇存儲介質加以存放,且一經確定,數據塊的位置將不再發生改變,數據塊所處存儲介質的性能優劣是隨機的,不會根據數據的熱度智能的選擇數據塊的存放位置。為實現數據的更合理分布,新增一項工作:在DataNode初始化時,統計處于自身管理下的存儲介質的種類,并確定每種存儲介質的讀寫性能值,在DataNode運行的過程中,新增一個調度線程BlockScheduler,對存儲介質進行分類管理。
當DataNode收到客戶端創建新文件的請求時,會在寫性能較好的存儲介質上為客戶端分配對應存儲空間(而不是原來的隨機分配存儲空間),當客戶端頻繁的對DataNode上的某個數據塊進行讀操作時,BlockScheduler會將該數據塊遷移到讀性能更好的存儲介質上去,當客戶端頻繁的對DataNode上的某個數據塊進行寫操作時,BlockScheduler會將該數據塊遷移到寫性能更好的存儲介質上去。當某種存儲介質的剩余空間不足時,BlockScheduler會對其進行閾值調度,根據存儲在其上的數據塊的讀寫頻率將數據塊分散到其他存儲介質上,以保持各存儲介質的良好狀態。通過以上的數據塊遷移工作,就可以使被頻繁訪問的熱數據存放在對應性能最好的存儲介質上,從而提高DataNode對外提供服務的效率,縮短系統響應時間。
調度線程BlockScheduler以一個固定時間為周期(TIME_GAP)對本DataNode管理下的所有數據塊的存儲位置進行調度。每個周期內,BlockScheduler線程處于休眠狀態(最大限度降低調度線程帶來的系統開銷),DataNode在處理客戶端請求后,會額外增加一項計數工作:客戶端執行修改數據塊(Append)請求后將涉及到的數據塊對應的被寫次數(writeCount)加1;客戶端執行讀數據塊(Read)請求后會將涉及到的數據塊對應的被讀次數(readCount)加1。
每個周期結束時,BlockScheduler會統計每個數據塊被讀寫的次數,同時考慮數據塊所在存儲介質的性能參數,對針對每個數據塊進行以下計算:
readCount/READ_PARAMETER + writeCount/WRITE_PARAMETER = needMove
(1)
readCount - writeCount = moveDest
(2)
把它們定義成參數,統計得到所有數據塊的needMove的最大值moveStandard,根據moveStandard和存儲介質種類數COUNT以及每個數據塊needMove計算得到每個數據塊應提升的性能指數finalNeedMove:
finalNeedMove = COUNT/2 * needMove/moveStandard
(3)
設定一個判定讀寫性能是否平衡的閾值標準RW_Blance_Threshold,根據moveDest與RW_Blance_Threshold的差值格式化為[-1,1]:
* 如果moveDest < -RW_Blance_Threshold,則置moveDest為-1;
* 如果moveDest > RW_Blance_Threshold,則置moveDest為 1;
* 如果 |moveDest| < RW_Blance_Threshold則置moveDest為 0。
依次對各數據塊進行判斷,如果finalNeedMove大于0,則將此數據塊根據moveDest移動到其他存儲介質,移動方向為:性能平衡性[moveDest-1,moveDest+1],綜合性能指數提高needMove,如果對應存儲器不可用,則將性能指數再加1,依次類推,最高提高到性能平衡性[moveDest-1,moveDest+1]中綜合性能的最大值。
以上的調度過程持續不斷的將數據從低性能存儲介質上遷移數據到高性能存儲介質之上,當熱數據被大量的遷移到性能較好的存儲介質上后,相應的存儲空間可能會被用盡,所以需要對各存儲介質設相應的閾值,以保證存儲介質剩余空間狀態良好。當存儲器的容量達到閾值時,依然可以接收數據塊。上文提到,每個周期結束時,會對熱數據進行調度,如果調度的過程中發現數據遷移的目標存儲介質容量不足,則會對此存儲介質進行閾值調度。
在對某存儲介質進行閾值調度時,BlockScheduler會統計得到系統中所有數據塊被讀寫次數的值(同上文提到的readCount、writeCount),并進行以下計算:
readCount + writeCount = needLie
(4)
計算出所有數據塊的needLie值之后,BlockScheduler會統計needLie的最大值lieStandard,并以此為標準,結合系統中存儲器種類數(COUNT)計算出此存儲介質上的所有數據塊應處于何種性能參數的存儲介質之上。
finalNeedLie = COUNT* needLie/lieStandard
(5)
最后,BlockScheduler會根據每個數據塊的finalNeedLie值和moveDest(上午提到,在進行數據塊調度時,已經計算得到了moveDest的值)將其轉移到綜合性能為對應值的存儲介質上。統計平衡性[moveDest-1,moveDest+1]內可用的存儲器,根據finalNeedLie的值進行轉移,如果對應性能的存儲器的容量達到閾值LOAD_THRESHOLD時,則將性能指數加1進行轉移,依次類推,加到最大值還未找到則重新從性能最小值開始循環。
論文提出的數據分布優化方案,將數據塊在DataNode內部各存儲介質間進行遷移,能否高效的完成并去取得預期的效果取決于以下幾個關鍵因素。
(1)合理確定存儲介質的性能參數。 為了較準確的確定數據塊的合理位置,必須為存儲介質的讀寫性能確定一個合理的參數。如果這個參數不能科學的確定,調度工作就沒有科學的依據,也就變得毫無意義。
(2)合理評估數據被訪問的頻繁程度。 對數據塊進行調度最大的根據就是數據塊被訪問的頻率,在系統實現中,必須根據數據塊被讀寫的次數對數據塊的熱度有一個科學的評估,同時聯系該數據塊所在的存儲介質的性能參數,合理的判定該數據塊是否需要被遷移。如果無法對數據的熱度進行合理的評估,對數據塊的遷移就沒有了正確的方向,還有可能導致某個數據塊被遷來遷去,造成系統的震蕩,反而降低了原系統的性能。
(3)保證各個存儲介質有足夠的剩余空間。 在對數據進行遷移的過程中,必須保證數據塊的合理分布,使各類型存儲介質都能有足夠的剩余空間,以保證調度過程能正常的進行。如果某種存儲介質剩余空間太小,就會導致無法接收更適合存儲在其上的數據塊,導致調度過程異常。
為使以上關鍵點得到有效的保證,本方案綜合考慮多種因素,并根據各要素對數據塊應處的位置做出合理的判斷。
(1)合理確定數據塊的存儲位置。 對數據塊進行調度的重點就是確定數據塊存儲在何種性能的存儲介質之上最為合理。本方案在確定這一問題時依據了存儲介質的性能參數和數據塊被讀寫的次數這兩個因素。在熱數據調度和閾值調度的過程中,確定數據塊應處位置的參數都是依據數據塊被讀寫次數和所在存儲介質性能參數的比例關系,這樣會使讀寫次數較多而存儲介質性能很差的數據塊得到較快的性能提升,而讀寫次數與存儲介質性能參數相符的數據塊會由于兩者比值很小而保持在當前位置或僅有較小的性能提升,較好的照顧到所處存儲介質較差的熱數據,同時也使處于合理位置的數據塊不會被頻繁的遷移,從而提高數據塊調度的效率,避免為系統增加過多的額外負擔。
(2)保證數據在各存儲介質間分布的平衡性。 隨著熱數據的遷移,性能較好的存儲介質上的數據量會越來越大,如果不對數據分布的平衡性進行考慮并建立相應的機制加以保證,性能較好的存儲介質的存儲空間會很快被耗盡,使更應該被遷移到此種介質上的數據塊無法完成遷移。本方案中的閾值調度較好的保證了數據在各存儲介質間分布的平衡性。當某種存儲介質剩余存儲空間不足時,會對其進行閾值調度,將存儲在其上的數據塊遷移到其他存儲介質中。在進行數據塊的遷移時,本方案重點考慮了數據塊被讀寫的次數,根據讀寫次數將數據塊遷移到性能最合適的存儲介質上,使得相應數據塊在之后的調度過程中再次被遷移的可能性降到最低,從而提高了數據調度的整體性能。
論文所實現方案測試環境配置如表1所示。

表1 測試環境配置
3.2.1 讀性能測試
如圖1、圖2所示,在對原Hadoop系統進行讀性能測試時,測試程序先頻繁地隨機讀取預存好的測試文件,持續一段任意長時間(測試時設定的時間為1 min)。然后測試程序將十個測試文件分別讀入內存并統計完成整個讀取過程花費的時間。在原Hadoop系統中,測試文件的位置整個測試的過程中保持其原來位置不變,未根據數據的熱度進行遷移,客戶端讀取文件的平均速度為94.67 MB/s。在改進后的Hadoop系統中,有3個文件(Text6、Text8、Text9)的讀取速度有顯著提升,這表明這些文件在被讀取的過程中存儲位置發生了改變,從低性能的存儲介質遷移到了高性能的存儲介質上,這使得客戶端讀取文件的平均速度提高為139.47 MB/s。改進方案使Hadoop系統的數據讀取速度提高了47.3%。

圖1 改進前后系統數據讀速度對比

圖2 改進前后系統數據寫速度對比
3.2.2 寫性能測試
在對原Hadoop系統和改進的系統進行寫性能測試時,測試程序從外部存儲介質(保證此存儲介質未被Hadoop系統使用,測試中用的是移動硬盤)將預先準備好的8個文件依次讀入內存,然后寫入到Hadoop系統中,并統計從內存中寫入Hadoop系統花費的時間。在原Hadoop系統中,文件的寫入位置是根據容量來隨機分配的,而在方案改進后的Hadoop系統中,文件的寫入位置被盡可能的安排在寫性能較好的存儲介質上,只有高性能存儲介質上容量不足時文件才會寫到低性能存儲介質上,這使得更多的文件被寫入了寫性能較好的存儲介質。如圖2所示,原Hadoop系統的平均寫入速度為71.56 MB/s,改進后的Hadoop系統的平均寫入速度為79.56 MB/s,改進方案使Hadoop系統的數據寫入速度提高了11.2%。
隨著越來越多的內存、SSD等新型存儲設備被廣泛使用,混合存儲系統逐步成為目前研究的重點。當前HDFS是針對同構集群設計的,無法將混合存儲系統中存儲介質的優勢無法完全的發揮出來。現有的對HDFS進行改進的方案都是針對任務調度、存儲性能隔離等問題而提出的,但是大數據環境下需要合理分布數據以獲得更高的訪問效率,論文對Hadoop數據分布方案進行了研究,提出一種在原系統處理邏輯基礎上的數據動態分布方案,在多種存儲介質組成的混合存儲系統中優化數據的分布,使Hadoop的讀速度提高了47.3%,寫速度提高了11.2%。同時方案根據數據塊的讀寫頻率,合理的判斷出數據塊的熱度并將數據塊遷移到最合適的存儲介質之上,在數據遷移的過程中也為各存儲介質的剩余空間的健康提供了保證機制,避免因數據塊的調度導致高性能存儲介質爆滿。