馮漢超,周凱東
(河北工程大學(xué)信息與電氣工程學(xué)院,河北邯鄲056038)
當(dāng)前社會(huì)已經(jīng)進(jìn)入數(shù)據(jù)爆炸的時(shí)代,海量數(shù)據(jù)的處理與分析被稱為“大數(shù)據(jù)”[1]。全世界億萬用戶通過互聯(lián)網(wǎng)相互聯(lián)系,隨之產(chǎn)生的數(shù)據(jù)也在高速增長(zhǎng)。在互聯(lián)網(wǎng)領(lǐng)域,與大數(shù)據(jù)有關(guān)的應(yīng)用已變的非常重要。由于傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)在管理大數(shù)據(jù)時(shí)遇到種種困難和阻礙,基于分布式的海量數(shù)據(jù)管理系統(tǒng)成了當(dāng)前的研究熱點(diǎn)。
Hadoop[2]是 MapReduce[3]分布式計(jì)算框架的實(shí)現(xiàn),為大數(shù)據(jù)處理提供可擴(kuò)展、高容錯(cuò)性的大型分布式集群?;贛apReduce的數(shù)據(jù)倉(cāng)庫(kù)[4]并不能直接管理集群中的數(shù)據(jù)存儲(chǔ),而是由Hadoop分布式存儲(chǔ)系統(tǒng)HDFS(Hadoop Distributed File System)[5-7]來管理海量數(shù)據(jù)。如何在 HDFS中設(shè)計(jì)一個(gè)高效的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)來組織大數(shù)據(jù)遇到了一系列的困難,而影響數(shù)據(jù)倉(cāng)庫(kù)性能的關(guān)鍵因素是能夠滿足充分利用MapReduce計(jì)算特性來處理大數(shù)據(jù)的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)。本文在分析分布式存儲(chǔ)系統(tǒng)HDFS局限性基礎(chǔ)上,通過改變數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)對(duì)大數(shù)據(jù)存儲(chǔ)和處理作出了一定改進(jìn)。
高速的數(shù)據(jù)加載。數(shù)據(jù)的高速加載是大數(shù)據(jù)處理中的一個(gè)關(guān)鍵問題,例如Facebook每天要有20TB的數(shù)據(jù)存放到數(shù)據(jù)倉(cāng)庫(kù)中。在正常的查詢時(shí),由于網(wǎng)絡(luò)帶寬、磁盤I/O在數(shù)據(jù)傳輸時(shí)的資源瓶頸,縮短數(shù)據(jù)加載時(shí)間變得非常關(guān)鍵。
高速的查詢處理。為滿足大量用戶同時(shí)向系統(tǒng)提交實(shí)時(shí)請(qǐng)求和高負(fù)載查詢,要求底層數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)在滿足數(shù)據(jù)不斷增長(zhǎng)的同時(shí),能夠高效處理查詢請(qǐng)求。
存儲(chǔ)空間的高利用率。不斷增長(zhǎng)的互聯(lián)網(wǎng)用戶,導(dǎo)致全球數(shù)據(jù)急劇增長(zhǎng)。這就要求系統(tǒng)在存儲(chǔ)上有很好的擴(kuò)展能力。如何存放數(shù)據(jù)使磁盤利用率達(dá)到最高是關(guān)鍵問題。
適應(yīng)動(dòng)態(tài)高負(fù)載模式。對(duì)于不同的應(yīng)用程序,用戶分析大數(shù)據(jù)集的方式不盡相同。雖然一些數(shù)據(jù)分析以靜態(tài)模式周期執(zhí)行,但大部分?jǐn)?shù)據(jù)分析不遵循任何的常規(guī)模式。因此,需要系統(tǒng)在有限的存儲(chǔ)空間下使用不可預(yù)測(cè)的數(shù)據(jù)分析請(qǐng)求,而不是在特定的模式下運(yùn)行。
行式存儲(chǔ)結(jié)構(gòu)[8]是傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu),記錄以行的形式存儲(chǔ)在數(shù)據(jù)庫(kù)關(guān)系表中。在添加行時(shí),記錄中所有的列都需要存儲(chǔ),且記錄被連續(xù)的存儲(chǔ)到磁盤的頁(yè)塊中。在分布式系統(tǒng)存儲(chǔ)下,表按行水平分割,每行中所有數(shù)據(jù)存放在同一個(gè)HDFS塊中。圖1表示以行式存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)在HDFS塊中的分布。
行式存儲(chǔ)在 Hadoop集群 DataNode[5]節(jié)點(diǎn)間的數(shù)據(jù)分布分析。以行式結(jié)構(gòu)存儲(chǔ)時(shí),每行中所有的列存放在同一個(gè)HDFS塊中。在分布式系統(tǒng)HDFS中,大表中的數(shù)據(jù)按行水平分割,分割后每組數(shù)據(jù)可能分布在不同的DataNode節(jié)點(diǎn)上。行式存儲(chǔ)在Hadoop集群DataNode節(jié)點(diǎn)間的數(shù)據(jù)分布結(jié)構(gòu)圖如圖2所示。
行式存儲(chǔ)時(shí)數(shù)據(jù)讀取操作分析。若讀取行中A和C兩列,首先讀取本地DataNode節(jié)點(diǎn)上所有符合條件的行,然后從每行中選擇A和C兩列數(shù)據(jù),過濾掉不需要的B和D列。行式數(shù)據(jù)讀取操作示意圖如圖3所示。
采用督脈上行腦部后正中線以枕骨粗隆上為定點(diǎn),每次進(jìn)針破骨約1 mm,每次選穴1個(gè)(四肢關(guān)節(jié)以骨面進(jìn)針,每次兩個(gè)穴位,每十天為一個(gè)療程,間隔七天第二個(gè)療程)病程需要3~5個(gè)療程,重者可以行81天,有的可以行兩個(gè)81天治療。急性患者選擇刺骨結(jié)合石學(xué)敏教授的醒腦開竅療效更好。
行式存儲(chǔ)結(jié)構(gòu)優(yōu)點(diǎn)和缺點(diǎn)分析。數(shù)據(jù)加載速度快,所有數(shù)據(jù)都從本地讀取,無需額外的網(wǎng)絡(luò)帶寬消耗。但是,每行中所有列都存放在相同的HDFS塊中,在數(shù)據(jù)讀取一行數(shù)據(jù)時(shí),行中所有列都需從磁盤上讀取,不需要的列也會(huì)被讀取,這樣會(huì)額外增加磁盤I/O開銷。
每列存儲(chǔ)的數(shù)據(jù)類型不能一樣,在數(shù)據(jù)壓縮時(shí)不同數(shù)據(jù)類型壓縮效果很差,這樣導(dǎo)致磁盤空間利用率低,同時(shí)也加大了磁盤I/O開銷。
列式存儲(chǔ)結(jié)構(gòu)[9-10]是將關(guān)系表按列垂直分割成多個(gè)子關(guān)系表,分割后的每組子關(guān)系表中的所有數(shù)據(jù)存放在同一個(gè)HDFS塊中,每一列都獨(dú)立存儲(chǔ)。列式存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)在HDFS塊中的分布如圖4所示。
列式存儲(chǔ)在Hadoop集群DataNode節(jié)點(diǎn)間的數(shù)據(jù)分布分析。以列式結(jié)構(gòu)存儲(chǔ)時(shí),每列中所有數(shù)據(jù)存放在同一個(gè)HDFS塊中。在分布式系統(tǒng)HDFS中,大表中的數(shù)據(jù)按列垂直分割,分割后每組數(shù)據(jù)可能分布在不同的DataNode節(jié)點(diǎn)上。列式存儲(chǔ)在Hadoop集群DataNode節(jié)點(diǎn)間的數(shù)據(jù)分布結(jié)構(gòu)圖如圖5所示。
列式存儲(chǔ)時(shí)數(shù)據(jù)讀取操作分析。若讀取行中A和C兩列,A和C列分別存放在兩個(gè)不同的節(jié)點(diǎn)上,首先從DataNode1上讀取A列所有數(shù)據(jù),再?gòu)腄ataNode3上讀取C列數(shù)據(jù),最后通過網(wǎng)絡(luò)將數(shù)據(jù)傳輸?shù)酵粋€(gè)機(jī)器上。列式數(shù)據(jù)讀取操作示意圖如圖6所示。
列式存儲(chǔ)結(jié)構(gòu)優(yōu)點(diǎn)和缺點(diǎn)分析。列式存儲(chǔ)只讀取有用的列,能夠避免額外的磁盤I/O開銷。同時(shí),同一列中的數(shù)據(jù)類型相同,在數(shù)據(jù)壓縮時(shí)有很好的壓縮比,提高磁盤的空間利用率。但是,列式存儲(chǔ)是按列垂直分割,不同的列可能分布在不同的數(shù)據(jù)節(jié)點(diǎn)上,讀取不同列的數(shù)據(jù)會(huì)跨節(jié)點(diǎn)訪問,增加了網(wǎng)絡(luò)傳輸所消耗的時(shí)間。
通過以上行式存儲(chǔ)和列式存儲(chǔ)結(jié)構(gòu)的優(yōu)缺點(diǎn)分析,行式存儲(chǔ)主要是在讀取不必要的列消耗了額外的磁盤I/O,列式存儲(chǔ)主要是在跨節(jié)點(diǎn)查詢數(shù)據(jù)時(shí)消耗額外的網(wǎng)絡(luò)傳輸時(shí)間。最理想的情況是能夠避免額外的磁盤I/O消耗和網(wǎng)絡(luò)傳輸消耗。設(shè)從n行數(shù)據(jù)中讀取i列有效數(shù)據(jù),其行列存儲(chǔ)結(jié)構(gòu)在數(shù)據(jù)讀取和網(wǎng)絡(luò)消耗上比較如表1所示。
表1行式存儲(chǔ)與列式存儲(chǔ)讀取效率比較Tab.1 The efficiency of row store and colunn store
分別結(jié)合行式存儲(chǔ)和列式存儲(chǔ)節(jié)點(diǎn)的優(yōu)點(diǎn),將關(guān)系表中的數(shù)據(jù)先按水平劃分成多個(gè)行組(Row Group),每一個(gè)行組存放在同一個(gè) HDFS塊中。在每一個(gè)行組內(nèi),將表按列垂直劃分多個(gè)子關(guān)系表,每一列在進(jìn)行數(shù)據(jù)壓縮后獨(dú)立存儲(chǔ)在同一個(gè)HDFS塊中。行組在Hadoop集群DataNode節(jié)點(diǎn)間的數(shù)據(jù)分布如圖7所示。
行組內(nèi)按列垂直劃分多個(gè)列,每個(gè)列在數(shù)據(jù)壓縮后獨(dú)立存儲(chǔ)在HDFS塊中,每行中所有列都存放在同一個(gè)HDFS塊中,行組內(nèi)數(shù)據(jù)按列垂直分割后的列存儲(chǔ)方式在HDFS塊中分布結(jié)構(gòu)如圖8所示。
數(shù)據(jù)讀取操作分析。關(guān)系表被水平分割成多個(gè)行組,行組內(nèi)按列垂直分割,存儲(chǔ)在同一個(gè)HDFS塊中。若讀取列A和C,首先讀取本地行組,然后在行組中選擇需要的列A和C。這樣既避免了行式存儲(chǔ)結(jié)構(gòu)中讀取不必要的列而消耗額外的磁盤I/O,也避免了列式存儲(chǔ)結(jié)構(gòu)中因跨節(jié)點(diǎn)訪問而消耗額外的網(wǎng)絡(luò)傳輸時(shí)間。
數(shù)據(jù)壓縮分析。由于行組內(nèi)是按列垂直分割,每一列具有相同的數(shù)據(jù)類型,因此在數(shù)據(jù)壓縮時(shí)有很好的壓縮比,從而提高了磁盤空間的利用率。
Hadoop分布式存儲(chǔ)系統(tǒng)HDFS的塊大小默認(rèn)為64MB,該值可以在配置文件中修改。若行組的存儲(chǔ)空間比HDFS塊要大,則一個(gè)行組被存儲(chǔ)在多個(gè)HDFS塊中,帶來的問題主要有:
1)由分布式存儲(chǔ)系統(tǒng)特點(diǎn),不同的塊有可能分配在不同的數(shù)據(jù)節(jié)點(diǎn)中。因此,在數(shù)據(jù)訪問時(shí),有可能跨節(jié)點(diǎn)訪問,從而消耗了不必要的網(wǎng)絡(luò)傳輸時(shí)間。
2)HDFS的高容錯(cuò)性是默認(rèn)將每份數(shù)據(jù)在集群中有三處備份。若數(shù)據(jù)節(jié)點(diǎn)發(fā)生故障,因行列結(jié)合存儲(chǔ)結(jié)構(gòu)的約束,需要更長(zhǎng)的恢復(fù)時(shí)間,同時(shí)也需要額外維護(hù)。
所以每個(gè)行組分割的大小最大不能超過HDFS塊的大小,可以通過改變HDFS塊的大小來改變行組大小。
對(duì)行式存儲(chǔ)、列式存儲(chǔ)、行列結(jié)合的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)在數(shù)據(jù)加載時(shí)間和數(shù)據(jù)壓縮效率上進(jìn)行性能比較。比較結(jié)果如圖9所示。
通過測(cè)試比較,行式存儲(chǔ)在數(shù)據(jù)加載上,列式存儲(chǔ)消耗時(shí)間最長(zhǎng),行式存儲(chǔ)略優(yōu)于行列存儲(chǔ)。而在數(shù)據(jù)壓縮效果上,行式存儲(chǔ)壓縮效果最差,行列存儲(chǔ)壓縮效果最好。
行式數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)雖然在數(shù)據(jù)加載上有較好的效果,但由于列的數(shù)據(jù)類型不同,在數(shù)據(jù)壓縮上效率很低,不能有效地提高磁盤利用率。列式存儲(chǔ)結(jié)構(gòu)雖然在數(shù)據(jù)壓縮上有很好的壓縮效果,但由于跨數(shù)據(jù)節(jié)點(diǎn)訪問使得數(shù)據(jù)加載時(shí)間較長(zhǎng),從而降低了系統(tǒng)吞吐量。行列相結(jié)合的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)不僅有行式結(jié)構(gòu)存儲(chǔ)的高效數(shù)據(jù)加載,同時(shí)有很好的數(shù)據(jù)壓縮效果。在分布式系統(tǒng)中,行列數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)極大地提高了大數(shù)據(jù)存儲(chǔ)及處理性能。
[1]MANYIKA J,CHUI M,BROWN B,et al.Big data:The next frontier for innovation,competition,and productivity[J].Comm unications of the ACM,2011,56(2):100-105.
[2]WHITE T.Hadoop:the definitive guide[M].O 'Reilly,2012.
[3]DEAN J,GHEMAWAT S.MapReduce:simplified data processing on large clusters[J].Communications of the ACM,2008,51(1):107-113.
[4]THUSOO A,SARMA J S,JAIN N,et al.Hive:a warehousing solution over a map - reduce framework[J].Proceedings of the VLDB Endowment,2009,2(2):1626-1629.
[5]BORTHAKUR D.The hadoop distributed file system:Architecture and design[J].Hadoop Project Website,2007(11):21.
[6]KAUSHIK R T,BHANDARKAR M,NAHRSTEDT K.Evaluation and analysis of greenhdfs:A self- adaptive,energy-conserving variant of the hadoop distributed file system[C]//Cloud Computing Technology and Science(CloudCom),2010 IEEE Second International Conference on.IEEE,2010:274-287.
[7]SHVACHKO K,KUANG H,RADIA S,et al.The hadoop distributed file system[C]//Mass Storage Systems and Technologies(MSST),2010 IEEE 26th Symposium on.IEEE,2010:1-10.
[8]LI N,RAO J,SHEKITA E,et al.Leveraging a scalable row store to build a distributed text index[C]//Proceedings of the first international workshop on Cloud data management.ACM,2009:29-36.
[9]IVANOVA M G,KERSTEN M L,NES N J,et al.An architecture for recycling intermediates in a column-store[J].ACM Transactions on Database Systems(TODS),2010,35(4):24.
[10]ABADI D J,BONCZ P A,HARIZOPOULOS S.Column- oriented database systems[J].Proceedings of the VLDB Endowment,2009,2(2):1664 -1665.