霍緯綱,程文莉,李繼龍
(中國(guó)民航大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,天津 300300)
QAR(quick access recorder)意為快速存取記錄器,是指帶保護(hù)裝置的機(jī)載飛行數(shù)據(jù)記錄設(shè)備。QAR數(shù)據(jù)涵蓋了飛機(jī)飛行操縱品質(zhì)監(jiān)控的絕大部分參數(shù),具有時(shí)序性、容量大、參數(shù)多等特點(diǎn),是典型的多維時(shí)間序列數(shù)據(jù)。目前,中國(guó)民航每一架飛機(jī)上都已安裝快速存取記錄器,用以記錄飛機(jī)包含的所有傳感器每秒鐘所產(chǎn)生的數(shù)據(jù)。據(jù)統(tǒng)計(jì),一個(gè)中等規(guī)模航空公司每年產(chǎn)生的QAR數(shù)據(jù)量可達(dá)到PB級(jí),甚至TB級(jí)。通過(guò)對(duì)QAR數(shù)據(jù)的有效存儲(chǔ)和分析,航空公司可以掌握公司航班飛行的安全動(dòng)態(tài),從而有針對(duì)性地加強(qiáng)安全監(jiān)管,減少事故隱患,提高飛行品質(zhì)[1]。
傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在存儲(chǔ)海量QAR數(shù)據(jù)時(shí)存在性能瓶頸、數(shù)據(jù)組織模式單一、延時(shí)較高等諸多問(wèn)題[2]。HBase[3](Hadoop database)是一個(gè)高可靠、高性能、面向列、可伸縮的分布式數(shù)據(jù)庫(kù),數(shù)據(jù)模式簡(jiǎn)單、靈活、存儲(chǔ)速度快、擴(kuò)展性高。文獻(xiàn)[4-7]將HBase數(shù)據(jù)庫(kù)分別應(yīng)用于智能交通、船舶自動(dòng)識(shí)別、云智能室內(nèi)環(huán)境監(jiān)測(cè)、生物DNA與蛋白質(zhì)對(duì)等領(lǐng)域,都驗(yàn)證了HBase作為海量數(shù)據(jù)存儲(chǔ)的可靠性。但根據(jù)QAR數(shù)據(jù)的特點(diǎn)和應(yīng)用場(chǎng)景設(shè)計(jì)基于HBase的存儲(chǔ)模式和行鍵結(jié)構(gòu)至關(guān)重要。根據(jù)HBase中的數(shù)據(jù)寫(xiě)入及存儲(chǔ)特點(diǎn),如果僅按照快速存取記錄器的采集時(shí)間作為行鍵,雖然從一定程度上能夠保證查詢效率,但在數(shù)據(jù)寫(xiě)入時(shí),集群會(huì)出現(xiàn)熱點(diǎn)問(wèn)題,造成較大的寫(xiě)入延遲。另外,QAR數(shù)據(jù)參數(shù)眾多(維數(shù)高),需設(shè)計(jì)合理的HBase表結(jié)構(gòu),以滿足航空公司對(duì)QAR數(shù)據(jù)分析的查詢需求。本文設(shè)計(jì)實(shí)現(xiàn)了一種基于HBase的QAR數(shù)據(jù)存儲(chǔ)模式。該存儲(chǔ)模式能夠較好滿足航空公司分析飛行超限事件的業(yè)務(wù)需求。將QAR數(shù)據(jù)劃分為七大主題,設(shè)計(jì)了基于主題優(yōu)化策略的行鍵,并采用了預(yù)分區(qū)技術(shù),避免了寫(xiě)熱點(diǎn)問(wèn)題,使QAR數(shù)據(jù)能均衡地分布在集群中。
HBase作為時(shí)間序列數(shù)據(jù)的存儲(chǔ)介質(zhì)在工業(yè)領(lǐng)域中有著廣泛的應(yīng)用。文獻(xiàn)[8]從不同角度探討、設(shè)計(jì)了行鍵結(jié)構(gòu),并通過(guò)二級(jí)索引改善了HBase的查詢效率,但隨著RegionServer(HBase集群中的從節(jié)點(diǎn))中的Region(HBase中數(shù)據(jù)存儲(chǔ)和管理的基本單元)發(fā)生split(分裂)操作,其索引結(jié)構(gòu)需要不斷更新,帶來(lái)更新延遲;文獻(xiàn)[9]通過(guò)采用MySQL和HBase存儲(chǔ)地震業(yè)務(wù)需求的結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù),非結(jié)構(gòu)化數(shù)據(jù)采用基于列簇級(jí)別的大對(duì)象對(duì)文件形式的數(shù)據(jù)進(jìn)行管理,對(duì)小文件數(shù)據(jù)的存儲(chǔ)有較好的效果;劉博偉等[10]對(duì)于金融的時(shí)序數(shù)據(jù)的存儲(chǔ):該系統(tǒng)采用了異步機(jī)制的時(shí)間驅(qū)動(dòng)的Netty中間件,對(duì)高并發(fā)事務(wù)有較好的處理性能,設(shè)計(jì)了基于HBase的行鍵優(yōu)化策略和基于時(shí)序數(shù)據(jù)的表設(shè)計(jì)策略,在一定程度上解決了HBase存儲(chǔ)熱點(diǎn)問(wèn)題以及數(shù)據(jù)存儲(chǔ)的分散問(wèn)題;陸婷等[11]利用多源緩沖結(jié)構(gòu)對(duì)不同類(lèi)型的流數(shù)據(jù)進(jìn)行隊(duì)列劃分,結(jié)合一致性哈希、多線程技術(shù)、行鍵優(yōu)化設(shè)計(jì)策略將數(shù)據(jù)存入HBase,實(shí)現(xiàn)了多源數(shù)據(jù)的存儲(chǔ)性能的提升,具有良好的擴(kuò)展性能;王遠(yuǎn)等[12]針對(duì)海量智能電網(wǎng)數(shù)據(jù)的存儲(chǔ),提出以策略驅(qū)動(dòng)的基于HBase的時(shí)序數(shù)據(jù)存儲(chǔ)方法,在OpenTSDB中實(shí)現(xiàn)了數(shù)據(jù)分散存儲(chǔ)同一時(shí)間產(chǎn)生的數(shù)據(jù),提高了數(shù)據(jù)加載時(shí)的I/O能力和查詢分析能力,但只適用于數(shù)值型數(shù)據(jù),存在一定的局限性;Ochiai H[13]等設(shè)計(jì)了基于HBase的樓宇設(shè)備信息管理系統(tǒng),收集某棟大樓內(nèi)的光照、暖通等設(shè)備傳感器的數(shù)據(jù)進(jìn)行存儲(chǔ)。基于非關(guān)系型模型的QAR數(shù)據(jù)存儲(chǔ)研究工作相對(duì)較少,馮興杰等[14]設(shè)計(jì)了基于Hive的數(shù)據(jù)倉(cāng)庫(kù)的構(gòu)建:通過(guò)對(duì)Hive特點(diǎn)及QAR數(shù)據(jù)結(jié)構(gòu)分析,設(shè)計(jì)了基于Hive的QAR數(shù)據(jù)倉(cāng)庫(kù)的存儲(chǔ)結(jié)構(gòu),該設(shè)計(jì)更適用于分析型應(yīng)用,無(wú)法滿足具有低延遲要求的QAR操作型應(yīng)用需求。本文在上述工作基礎(chǔ)上,根據(jù)QAR數(shù)據(jù)特點(diǎn),設(shè)計(jì)實(shí)現(xiàn)了基于HBase的QAR數(shù)據(jù)存儲(chǔ)模式,實(shí)驗(yàn)結(jié)果表明該存儲(chǔ)模式具有良好的存取性能。
經(jīng)過(guò)與領(lǐng)域?qū)<矣懻?,將航空公司所關(guān)注的問(wèn)題按主題對(duì)QAR數(shù)據(jù)進(jìn)行劃分,歸納為以下主題:安全分析主題、航跡描繪主題、節(jié)省燃油主題、發(fā)動(dòng)機(jī)狀況主題、預(yù)測(cè)主題、飛行員操作分析主題和其它主題。主題與QAR參數(shù)的對(duì)應(yīng)關(guān)系見(jiàn)表1。
表1 參數(shù)主題劃分
2.2.1 HBase表結(jié)構(gòu)設(shè)計(jì)
經(jīng)譯碼后的每個(gè)QAR文件包含飛機(jī)的航班信息、參數(shù)信息、參數(shù)值3部分,所以文中將每個(gè)QAR文件中的數(shù)據(jù)劃分為航班元信息、參數(shù)元信息和參數(shù)值3類(lèi)。根據(jù)QAR文件中的數(shù)據(jù)類(lèi)別和超限事件分析需求設(shè)計(jì)了4張表,分別是航班元信息表Flight_info,參數(shù)元信息表Para_info,航班參數(shù)索引表Index和數(shù)據(jù)值表Value。
Flight_info表的行鍵為航班號(hào)與日期的組合。該表包含一個(gè)列簇Flight_CF,列簇中的列分別為航空公司、機(jī)尾號(hào)、起飛時(shí)間、落地時(shí)間、起飛機(jī)場(chǎng)、落地機(jī)場(chǎng)、航班序列號(hào),其中航班序列號(hào)對(duì)應(yīng)每個(gè)QAR數(shù)據(jù)文件唯一編號(hào),記為fid。Flight_info表的表結(jié)構(gòu)見(jiàn)表2。
表2 Flight_info表結(jié)構(gòu)
Para_info表以參數(shù)名稱(chēng)作為Para_info表的行鍵,該表包含一個(gè)列簇Para_CF,該列簇包含參數(shù)的簡(jiǎn)稱(chēng)、單位、所屬主題、序列號(hào)。根據(jù)2.1節(jié)中的參數(shù)主題劃分確定參數(shù)的主題,記為topic,由每個(gè)參數(shù)的采集順序生成一個(gè)唯一的參數(shù)序列號(hào),記為pid,其結(jié)構(gòu)見(jiàn)表3。
表3 Para_info表結(jié)構(gòu)示意
Index表相當(dāng)于下文Value表的索引,該表共包含兩個(gè)列簇:Index_CF1和Index_CF2。該表的行鍵為航班號(hào)、航班日期、參數(shù)名三者的組合。Index_CF1列簇包含一個(gè)列,該列將Flight_info表的fid與Para_info表的pid進(jìn)行組合,記為paraid;Index_CF2列簇中包含一個(gè)列,該列存儲(chǔ)Index_CF1:paraid對(duì)應(yīng)的航班號(hào)、日期及參數(shù)對(duì)應(yīng)主題名三者組合的MD5值的前四字節(jié),即Value表行鍵的前四字節(jié),記為md5。Index表的結(jié)構(gòu)見(jiàn)表4。
表4 Index表結(jié)構(gòu)
Value表負(fù)責(zé)存儲(chǔ)QAR文件中參數(shù)的時(shí)序數(shù)據(jù)值,每行存儲(chǔ)一個(gè)航班文件中一個(gè)參數(shù)在一分鐘內(nèi)的數(shù)據(jù)。該表的行鍵設(shè)計(jì)參見(jiàn)2.2.2節(jié)的詳細(xì)說(shuō)明。除行鍵外,Value表包含一個(gè)列簇Value_CF,該列簇包含60列,分別存儲(chǔ)QAR參數(shù)一分鐘內(nèi)每秒的數(shù)據(jù)值,列名即為秒數(shù),其表結(jié)構(gòu)見(jiàn)表5。
2.2.2 Value表行鍵設(shè)計(jì)
根據(jù)QAR參數(shù)的主題劃分及2.2.1節(jié)HBase表結(jié)構(gòu)
表5 Value表存儲(chǔ)結(jié)構(gòu)
設(shè)計(jì)對(duì)Value表的行鍵結(jié)構(gòu)進(jìn)行了設(shè)計(jì),其結(jié)構(gòu)如圖1所示。Value表的行鍵設(shè)計(jì)中包含了以下信息:航班號(hào)、航班日期、參數(shù)及參數(shù)所屬主題、參數(shù)取值對(duì)應(yīng)的時(shí)間。由于在設(shè)計(jì)行鍵時(shí)應(yīng)保證行鍵的長(zhǎng)度應(yīng)盡量短,盡可能占用較少的存儲(chǔ)空間,本文設(shè)計(jì)行鍵長(zhǎng)度為16個(gè)字節(jié),行鍵的前4個(gè)字節(jié)內(nèi)容計(jì)算方式為:航班號(hào)、航班日期及參數(shù)主題進(jìn)行組合,采用MD5散列方法對(duì)該組合進(jìn)行處理,取散列值的高四字節(jié)作為行鍵的高4字節(jié)內(nèi)容。行鍵的中間八字節(jié)取Flight_info表的fid和Para_info表的pid序列號(hào)組合。低四字節(jié)取參數(shù)采集的時(shí)間中的小時(shí)、分鐘位。
圖1 Value表行鍵結(jié)構(gòu)
現(xiàn)以2017年7月19日的某航班的名為GROUND SPEED的參數(shù)在4∶46分的數(shù)據(jù)為例說(shuō)明Value表行鍵結(jié)構(gòu)及數(shù)據(jù)存儲(chǔ)形式。該航班的fid為0018,參數(shù)的pid為0179,將時(shí)間4∶46以0446表示,將一分鐘內(nèi)的數(shù)據(jù)存入Value表,其存儲(chǔ)形式如圖2所示。
圖2 行鍵計(jì)算
2.2.3 預(yù)分區(qū)設(shè)計(jì)
HBase在創(chuàng)建數(shù)據(jù)表時(shí)同時(shí)創(chuàng)建一個(gè)沒(méi)有起始和終止行鍵的Region,數(shù)據(jù)按照鍵值對(duì)的字典序升序向該Region中寫(xiě)入,隨著寫(xiě)入數(shù)據(jù)的增多,當(dāng)HBase中的Region達(dá)到閾值,會(huì)頻繁觸發(fā)Split操作。這種原始的寫(xiě)入機(jī)制會(huì)產(chǎn)生熱點(diǎn)問(wèn)題,并且split操作也會(huì)消耗集群的I/O資源。本文在2.2.2節(jié)基于MD5散列行鍵設(shè)計(jì)的基礎(chǔ)上,采用預(yù)分區(qū)策略,以進(jìn)一步提高集群讀寫(xiě)性能。具體分區(qū)策略如下:
取散列值的前兩個(gè)字節(jié)作為預(yù)分區(qū)的splitKey。MD5散列值的前兩個(gè)字節(jié)的取值范圍是00~ff,假設(shè)擬劃分m(m為整數(shù))個(gè)分區(qū),將00~ff范圍內(nèi)的候選splitKey從1開(kāi)始進(jìn)行編號(hào),按照如下方式初步確定預(yù)分區(qū)的splitKey,第n個(gè)region的切分鍵的序號(hào)產(chǎn)生方式如式(1)所示
(1)
(2)
其中,x的取值如式(3)所示
(3)
最后,根據(jù)得到的預(yù)分區(qū)結(jié)果生成二維字節(jié)數(shù)組splitKeys,創(chuàng)建預(yù)分區(qū)的Value表。
2.3.1 QAR數(shù)據(jù)存儲(chǔ)實(shí)現(xiàn)
下面按2.2.1節(jié)設(shè)計(jì)的表結(jié)構(gòu)說(shuō)明QAR數(shù)據(jù)的存儲(chǔ)過(guò)程。其中Flight_info表與Para_info表、Index表的存儲(chǔ)原理類(lèi)似,現(xiàn)以Flight_info表的存儲(chǔ)過(guò)程為例描述。文中將所有譯碼后的QAR數(shù)據(jù)文件的路徑記錄在文本文件file_path.txt中,通過(guò)讀取file_path.txt文件中的路徑打開(kāi)QAR文件,然后解析具體QAR文件的表頭第一,二行內(nèi)容,生成Flight_info表對(duì)應(yīng)的航班元數(shù)據(jù)信息。其中航班號(hào)為航空公司二位代碼和航班序號(hào)組成,航班日期按格式y(tǒng)yyymmdd進(jìn)行提取,機(jī)尾號(hào)為字母“B”加數(shù)位阿拉伯?dāng)?shù)字構(gòu)成,起落地機(jī)場(chǎng)為機(jī)場(chǎng)四字碼,起落地時(shí)間為12小時(shí)制,以AM與PM區(qū)分日間或夜間。在讀取QAR文件的路徑時(shí),記錄該路徑所在位置,生成4個(gè)字節(jié)的數(shù)字序列號(hào),將序列號(hào)賦值于fid。將QAR文件表頭與Flight_info表相關(guān)的數(shù)據(jù)以Put(List
圖3 Flight_info等表數(shù)據(jù)存儲(chǔ)流程
首先,創(chuàng)建List
Value表存儲(chǔ)QAR文件的參數(shù)值部分。首先,每100行為一組讀取QAR文件的數(shù)據(jù)部分。對(duì)于每組中的數(shù)據(jù)按照參數(shù)維進(jìn)行處理,取每行的參數(shù)采集時(shí)間切分為時(shí)分?jǐn)?shù)據(jù)和秒鐘數(shù)據(jù),按2.2.2節(jié)的行鍵設(shè)計(jì)方式組織行鍵,并創(chuàng)建對(duì)應(yīng)的Put對(duì)象,以秒鐘數(shù)據(jù)作為Value表的列名,將每分鐘的數(shù)據(jù)列添加至Put對(duì)象中,將該P(yáng)ut對(duì)象添加至Put列表對(duì)象中,最后提交到數(shù)據(jù)表,完成該組參數(shù)的數(shù)據(jù)值存儲(chǔ),再進(jìn)行下一組數(shù)據(jù)的存儲(chǔ)。
Value表數(shù)據(jù)寫(xiě)入
Input:file_path
Output:void
if(count% 100)then//每100行數(shù)據(jù)進(jìn)行處理
batch←List
forjfrom0tothirdlenthen//從參數(shù)維進(jìn)行循環(huán)處理
forkfrom0to100then//以讀取到的100行為循環(huán)對(duì)數(shù)據(jù)進(jìn)行處理
mintim←time(k).subString()//將時(shí)間的子字符串的時(shí)分?jǐn)?shù)據(jù)截取
sectime←time(k).subString()//獲取時(shí)間字符串的秒數(shù)數(shù)據(jù)
rowkey←md5+fid+pid(j)+mintime//組合為Value表的rowkey
qualifier←sectime//以秒鐘時(shí)間作為列名
value←value[k][j]//將數(shù)據(jù)部分的參數(shù)值作為value值
put←Put(rowkey)//以rowkey創(chuàng)建Put對(duì)象
put.addColumn(CF,qulifer,value)//將鍵值對(duì)添加至對(duì)應(yīng)行的put對(duì)象
batch.add(put)//將Put對(duì)象添加到列表中
endfor
endfor
table.put(batch)//將Put列表提交到對(duì)應(yīng)表
endif
2.3.2 數(shù)據(jù)查詢實(shí)現(xiàn)
定義f、p、t1、t2分別代表航班號(hào)、參數(shù)名稱(chēng)、起始查詢時(shí)間、終止查詢時(shí)間,飛行品質(zhì)監(jiān)控分析中典型的查詢條件表示為q(f,p,t1,t2)。 例如2017年7月19日航班號(hào)為AB2834的航班,k時(shí)間在12:34到12:36的地速GROUND SPEED取值查詢表示為q("AB283420170719","GROUND SPEED", "1234","1236")。 現(xiàn)以該查詢?yōu)槔f(shuō)明文中的QAR數(shù)據(jù)查詢實(shí)現(xiàn)過(guò)程,具體如下:
首先,根據(jù)查詢參數(shù)f="AB283420170719"、p="GROUND SPEED"、t1="1234"、t2="1236",將查詢條件按照index表的行鍵結(jié)構(gòu)進(jìn)行組織,得到index表的rowkey="AB283420170719GROUND SPEED",通過(guò)行鍵過(guò)濾器獲取到index表對(duì)應(yīng)的paraid列值:“00180179”和md5列值:“c9c6”;然后,將兩列值組合得到Value表行鍵的高十二字節(jié)。其次,將查詢的參數(shù)的時(shí)間范圍添加至Value表行鍵的低四字節(jié),得到查詢Value表的行鍵范圍:"AB283420170719GROUND SPEED1234"~"AB283420170719GROUND SPEED1236";設(shè)置二級(jí)過(guò)濾器,分別以GREATER、LESS對(duì)Value表進(jìn)行過(guò)濾;最后,創(chuàng)建掃描器對(duì)象,將二級(jí)過(guò)濾器添加至掃描器對(duì)象,返回查詢結(jié)果。其它飛行品質(zhì)監(jiān)控的查詢場(chǎng)景如單值查詢、基于參數(shù)主題的查詢等與上述查詢?cè)硐嗨啤?/p>
飛行品質(zhì)分析典型查詢實(shí)現(xiàn)
Input:f,p,t1,t2
Output: result
table1←pool.getTable(“Index”)//通過(guò)連接池創(chuàng)建與Index表的連接
table2←pool.getTable(“Value”)
rowkey1←f+p//將查詢航班號(hào)、 參數(shù)名組合為index表的查詢行鍵
get←Get(rowkey1)//創(chuàng)建get對(duì)象
paraid←table1.get.addColumn(“paraid”)//從index表獲取paraid列
md5←table1.get.addColumn(“md5”)//從index表獲取md5列
startrowkey←md5+paraid+t1//將時(shí)間與md5、paraid組合為查詢起始行鍵
endrowkey←md5+paraid+t2//將時(shí)間與md5、paraid組合為查詢終止行鍵
setfilter1(GREATER,startrowkey)//對(duì)起始行鍵按GREATER指定過(guò)濾器1
setfilter2(LESS,endrowkey)//對(duì)終止行鍵按LESS指定過(guò)濾器2
filterlist←FilterList//創(chuàng)建過(guò)濾器列表,為多級(jí)過(guò)濾器指定通過(guò)方式
scan←Scan()//創(chuàng)建掃描器對(duì)象
scan.setFilter(filterList)//為掃描器對(duì)象設(shè)置過(guò)濾器列表
scanner←table.getScanner(scan)//在數(shù)據(jù)表上創(chuàng)建掃描器
result←scanner.next()//得到Result結(jié)果集,并輸出
實(shí)驗(yàn)數(shù)據(jù)為某航空公司2017年200個(gè)航段的QAR數(shù)據(jù)文件。實(shí)驗(yàn)集群包含3個(gè)節(jié)點(diǎn):一個(gè)主節(jié)點(diǎn)master和兩個(gè)虛擬從節(jié)點(diǎn)slave1、slave2。集群整體搭建在一臺(tái)內(nèi)存為16 G、磁盤(pán)存儲(chǔ)空間為2 T的服務(wù)器上,服務(wù)器型號(hào)為Power-Edge T130。每個(gè)節(jié)點(diǎn)分配50 GB磁盤(pán)空間,1 GB內(nèi)存,單核CPU。Hadoop集群的版本分別為Hadoop 2.7.3,Zookeeper3.4.10,HBase1.2.6。文中設(shè)置分區(qū)個(gè)數(shù)m為27,按照2.2.3節(jié)預(yù)分區(qū)設(shè)計(jì)方法,經(jīng)過(guò)預(yù)分區(qū)的測(cè)試實(shí)驗(yàn),確定預(yù)分區(qū)的Splitkey為{1, 1b, 2a, 2f, 2z, 3b, 42, 4e, 5c, 65, 6f, 72, 7b, 80, 8f, 93, 9e, a6, ac, b4, bf, ca, d, df, f, fc}。集群中HDFS的復(fù)制因子設(shè)置為2。
實(shí)驗(yàn)在QAR文件數(shù)量逐步遞增的情況下,驗(yàn)證集群中QAR數(shù)據(jù)存儲(chǔ)分布效果。共設(shè)置了5個(gè)測(cè)試,每個(gè)測(cè)試使用的QAR文件個(gè)數(shù)見(jiàn)表6。實(shí)驗(yàn)結(jié)果如圖4所示。
圖4中橫坐標(biāo)表示測(cè)試的次數(shù),左側(cè)縱坐標(biāo)表示集群數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)量,右側(cè)縱坐標(biāo)表示實(shí)驗(yàn)過(guò)程中所用數(shù)據(jù)總量,單位均為GB。DN1、DN2表示集群的數(shù)據(jù)節(jié)點(diǎn)DataNode1、DataNode2,數(shù)據(jù)量圖例表示每次測(cè)試實(shí)驗(yàn)的數(shù)據(jù)量大小。從圖中不難看出,集群的數(shù)據(jù)節(jié)點(diǎn)DN1、DN2
表6 實(shí)驗(yàn)一數(shù)據(jù)
的數(shù)據(jù)量在各測(cè)試實(shí)驗(yàn)中始終保持相對(duì)均衡,隨著數(shù)據(jù)總量的線性增長(zhǎng),各數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)增長(zhǎng)也呈現(xiàn)相同的趨勢(shì),各數(shù)據(jù)節(jié)點(diǎn)中存儲(chǔ)的數(shù)據(jù)量大小相差少于2%。本設(shè)計(jì)中,Value表的行鍵高位采用了哈希處理,使Value表中的數(shù)據(jù)分布具有更好的離散性,避免了數(shù)據(jù)寫(xiě)熱點(diǎn)問(wèn)題的發(fā)生。在行鍵的哈希設(shè)計(jì)基礎(chǔ)上,Value表采用預(yù)分區(qū)技術(shù),共劃分27個(gè)分區(qū),各數(shù)據(jù)節(jié)點(diǎn)上的數(shù)據(jù)分區(qū)數(shù)量相對(duì)均衡,避免了數(shù)據(jù)傾斜。
圖4 QAR數(shù)據(jù)存儲(chǔ)實(shí)驗(yàn)結(jié)果
根據(jù)實(shí)際飛行品質(zhì)分析需求,本節(jié)設(shè)置了3種不同的查詢場(chǎng)景。具體如下:
實(shí)驗(yàn)1:查詢指定航班指定參數(shù)連續(xù)5分鐘內(nèi)的300個(gè)參數(shù)數(shù)據(jù)。
實(shí)驗(yàn)2:查詢指定航班指定主題下的5個(gè)不同參數(shù),在1分鐘內(nèi)的60個(gè)連續(xù)數(shù)據(jù),共300個(gè)值。
實(shí)驗(yàn)3:查詢指定航班5個(gè)不同主題下的指定參數(shù)在1分鐘內(nèi)的60個(gè)連續(xù)數(shù)據(jù),共300個(gè)值。
以上的每個(gè)實(shí)驗(yàn)均進(jìn)行20次測(cè)試,實(shí)驗(yàn)結(jié)果如圖5~圖7所示。圖5~圖7中橫坐標(biāo)表示實(shí)驗(yàn)次數(shù),縱坐標(biāo)表示查詢耗時(shí),單位為ms。圖5~圖7中的20次查詢的平均耗時(shí)分別為291.45 ms,1860.4 ms,1992 ms。由此可知,文中的存儲(chǔ)設(shè)計(jì)最適用于查詢指定QAR參數(shù)在一段時(shí)間內(nèi)的連續(xù)取值序列。同一主題下的不同參數(shù)的取值序列查詢效率高于不同主題的參數(shù)取值查詢。這是因?yàn)樵诒疚腣alue表的行鍵結(jié)構(gòu)設(shè)計(jì)中,基于航班號(hào)和參數(shù)主題的哈希散列值能使同一個(gè)主題的不同參數(shù)連續(xù)存儲(chǔ)在region中,在行鍵的中間八字節(jié)采用航班編號(hào)及參數(shù)編號(hào)對(duì)參數(shù)進(jìn)行精確定位,Value表行鍵的低四字節(jié)取參數(shù)的采集時(shí)間,使得同一參數(shù)的數(shù)據(jù)以時(shí)間的遞增順序存儲(chǔ)在連續(xù)空間中。
圖5 實(shí)驗(yàn)1結(jié)果
圖6 實(shí)驗(yàn)2結(jié)果
圖7 實(shí)驗(yàn)3結(jié)果
為了驗(yàn)證文中設(shè)計(jì)的存儲(chǔ)模式在典型QAR數(shù)據(jù)查詢分析上的有效性,與文獻(xiàn)[10]中存儲(chǔ)時(shí)序數(shù)據(jù)的行鍵設(shè)計(jì)策略進(jìn)行了對(duì)比。根據(jù)文獻(xiàn)[10]的行鍵設(shè)計(jì)方法,實(shí)驗(yàn)中將航班號(hào)、日期、參數(shù)名及參數(shù)采集時(shí)間作為行鍵,以指定航班指定參數(shù)在一段時(shí)間內(nèi)的取值序列為查詢場(chǎng)景,查詢序列長(zhǎng)度分別為300、3000、300 000,每個(gè)實(shí)驗(yàn)均進(jìn)行20次。實(shí)驗(yàn)結(jié)果如圖8(a)~圖8(c)所示。圖8中每個(gè)圖的橫坐標(biāo)為實(shí)驗(yàn)次數(shù),縱坐標(biāo)為讀取耗時(shí),單位為ms。由圖8(a)可知,在讀取參數(shù)取值序列較短的情況下,本文存儲(chǔ)設(shè)計(jì)模式的查詢耗時(shí)與采用文獻(xiàn)[10]的行鍵設(shè)計(jì)存儲(chǔ)模式下的查詢耗時(shí)相差較小。但是,從圖8(b),圖8(c)不難看出,隨著參數(shù)取值序列的增長(zhǎng),本文存儲(chǔ)模式下的查詢耗時(shí)明顯低于文獻(xiàn)[10]的行鍵設(shè)計(jì)策略的查詢耗時(shí)。這是因?yàn)榘凑瘴墨I(xiàn)[10]的設(shè)計(jì)進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí),隨著存儲(chǔ)數(shù)據(jù)量的不斷增大,HBase中的Region會(huì)進(jìn)行多次分裂。在進(jìn)行數(shù)據(jù)查詢時(shí),HBase首先根據(jù)查詢條件生成的行鍵值確定Region,然后對(duì)該Region進(jìn)行掃描得到查詢結(jié)果。而本文根據(jù)航班號(hào)與參數(shù)主題散列值的前兩個(gè)字節(jié)及預(yù)實(shí)驗(yàn),將Value表分為了27個(gè)Region。在查詢過(guò)程中,本文能根據(jù)航班號(hào)與參數(shù)名對(duì)應(yīng)散列值的前兩個(gè)字節(jié)快速定位待查詢數(shù)據(jù)所在的Region,該過(guò)程的耗時(shí)少于文獻(xiàn)[10]定位Region的策略。而且本文生成每個(gè)Region內(nèi)的數(shù)據(jù)量也少于文獻(xiàn)[10]中由HBase系統(tǒng)自動(dòng)生成的Region,從而使本文在Region內(nèi)部的數(shù)據(jù)查詢時(shí)間也較少。
圖8 與文獻(xiàn)[10]實(shí)驗(yàn)對(duì)比結(jié)果
文中設(shè)計(jì)實(shí)現(xiàn)了基于HBase的QAR數(shù)據(jù)文件的分布式存儲(chǔ)模式。根據(jù)飛行品質(zhì)監(jiān)控業(yè)務(wù)需求,將QAR參數(shù)集合劃分為七大主題。設(shè)計(jì)了基于參數(shù)主題的行鍵組織結(jié)構(gòu)和基于行鍵MD5散列值的預(yù)分區(qū)技術(shù)。真實(shí)QAR數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果表明,文中的設(shè)計(jì)能使QAR數(shù)據(jù)文件均勻存儲(chǔ)在HBase集群中,在飛行品質(zhì)分析中典型的QAR參數(shù)取值序列查詢場(chǎng)景下有較高的查詢效率。