許丹亞 歐陽慎 齊晨虹 朱志 尹文志
摘要:當(dāng)前,普速鐵路故障點檢測手段多樣,各種檢測數(shù)據(jù)的類型多樣,數(shù)據(jù)量大,查詢分析邏輯復(fù)雜。不同于以往基于關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)處理,方案基于Hadoop大數(shù)據(jù)集群,采用低代碼的形式和多種數(shù)據(jù)處理工具,設(shè)計實現(xiàn)工務(wù)數(shù)據(jù)同步、存儲、查詢、共享流程,降低了數(shù)據(jù)存儲成本,提高了數(shù)據(jù)查詢效率。同時,有助于后續(xù)其他業(yè)務(wù)系統(tǒng)的海量數(shù)據(jù)開發(fā)流程優(yōu)化,為鐵路各項業(yè)務(wù)提供穩(wěn)定、高效數(shù)據(jù)處理方案。
關(guān)鍵詞:大數(shù)據(jù);Phoenix;DataX;鐵路;Hadoop
中圖分類號:TP391? ? ? ? 文獻標(biāo)識碼:A
文章編號:1009-3044(2023)13-0076-03
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID)
1 引言
我國鐵路系統(tǒng)正在進入大數(shù)據(jù)的時代,每天多個業(yè)務(wù)系統(tǒng)將產(chǎn)生海量數(shù)據(jù),且數(shù)據(jù)量逐年增加[1-3]。近年來,中國鐵路鄭州局集團公司普速鐵路故障點檢測手段多樣,包括晃車儀、軌檢小車、人工添乘等。工務(wù)各種監(jiān)測數(shù)據(jù)體量龐大,數(shù)據(jù)類型復(fù)雜,業(yè)務(wù)查詢頻繁,對后續(xù)海量數(shù)據(jù)的深度挖掘帶來了一定困難。特別是,晃車儀數(shù)據(jù)主要依靠人工分析,鄭州局全局192臺晃車儀設(shè)備,每天產(chǎn)生幾萬條數(shù)據(jù)。因此,急需建立工務(wù)數(shù)據(jù)平臺,優(yōu)化工務(wù)各種檢測監(jiān)測數(shù)據(jù)的存儲、分析、共享流程。
當(dāng)前,有不少學(xué)者對鐵路業(yè)務(wù)的大數(shù)據(jù)應(yīng)用進行研究。衛(wèi)錚錚等人,研究了客運大數(shù)據(jù)平臺的鐵路客流預(yù)測系統(tǒng),集成了各類客流預(yù)測算法模型,為各類客運業(yè)務(wù)分析人員提供定制化客流預(yù)測數(shù)據(jù)[4]。王沛然等人,研究了鐵路數(shù)據(jù)服務(wù)平臺存儲架構(gòu)設(shè)計與應(yīng)用[5]。王萬齊等人,研究了京張高鐵運營安全大數(shù)據(jù)平臺設(shè)計及關(guān)鍵技術(shù),對京張高鐵安全數(shù)據(jù)共享共用、安全管理和安全預(yù)警能力提升,具有參考意義[6]。廉小親等人,研究了面向建設(shè)期鐵路大數(shù)據(jù)的分級存儲方法,有效地對鐵路建設(shè)期大數(shù)據(jù)進行存儲級別判定,實現(xiàn)了面向建設(shè)期鐵路大數(shù)據(jù)的分級存儲[7]。
面對工務(wù)檢測數(shù)據(jù)的數(shù)據(jù)量大、數(shù)據(jù)接入復(fù)雜、數(shù)據(jù)查詢分析復(fù)雜等問題,常用的數(shù)據(jù)流程設(shè)計方案通常以軟件代碼開發(fā)的形式接入數(shù)據(jù),采用關(guān)系型數(shù)據(jù)庫實現(xiàn)對多種數(shù)據(jù)的存儲和查詢。但這種方案在應(yīng)對超過千萬級數(shù)據(jù)量時,往往會出現(xiàn)查詢效率低下、存儲成本高等問題。因此,本文以低代碼的形式,基于Hadoop大數(shù)據(jù)集群和多種數(shù)據(jù)同步工具,設(shè)計并實現(xiàn)了工務(wù)大數(shù)據(jù)平臺,打通數(shù)據(jù)同步與清洗、數(shù)據(jù)存儲與查詢、數(shù)據(jù)共享等數(shù)據(jù)處理流程,優(yōu)化了數(shù)據(jù)處理手段,降低了數(shù)據(jù)存儲成本,提高了數(shù)據(jù)查詢效率。
2 總體方案設(shè)計
當(dāng)前工務(wù)車載分析系統(tǒng)可接入的數(shù)據(jù)源,種類多、總量大、查詢需求復(fù)雜,具體數(shù)據(jù)如下:
1) 數(shù)據(jù)種類多,同步情況不同
工務(wù)檢測數(shù)據(jù)種類多,當(dāng)前可接入的數(shù)據(jù)包括,晃車數(shù)據(jù)、軌檢超限大值、便攜添乘、軌檢小車、人工添乘主表、人工添乘從表等。晃車數(shù)據(jù),即晃車儀產(chǎn)生的數(shù)據(jù),目前以每月幾十萬條的速度增加,同步頻率為每半小時。軌檢超限大值、便攜添乘、軌檢小車、人工添乘主表、人工添乘從表等其他檢測監(jiān)測數(shù)據(jù),同步頻率為每天,每天增量從幾十到幾百不等。
2) 數(shù)據(jù)查詢需求復(fù)雜
針對各種檢測監(jiān)測數(shù)據(jù),當(dāng)前查詢內(nèi)容主要以檢測時間、線別、行別、里程范圍、垂直加速度、水平加速度等為主。在查詢的形式上,大多是針對單一數(shù)據(jù)內(nèi)容查詢,也有少許聯(lián)表查詢的需求,這些聯(lián)表查詢往往業(yè)務(wù)邏輯復(fù)雜。
3) 數(shù)據(jù)量大
晃車數(shù)據(jù)的數(shù)據(jù)量為千萬級別,其他數(shù)據(jù)的總量在幾萬到幾百萬之間。隨著時間增加,各監(jiān)測數(shù)據(jù)量在不斷增大,也增加了服務(wù)器存儲壓力。
根據(jù)以上數(shù)據(jù)特征,按照數(shù)據(jù)的處理流程,本文設(shè)計和實現(xiàn)了基于大數(shù)據(jù)技術(shù)的鐵路工務(wù)檢測數(shù)據(jù)平臺,主要包括數(shù)據(jù)同步、數(shù)據(jù)存儲與查詢、數(shù)據(jù)共享三部分,如圖1所示。
3 數(shù)據(jù)同步與清洗
通過DataX、Sqoop等數(shù)據(jù)同步工具,從物理和邏輯層次上,把各種監(jiān)測數(shù)據(jù)集中匯聚,完成數(shù)據(jù)同步與清洗,為后續(xù)大數(shù)據(jù)應(yīng)用開發(fā)提供數(shù)據(jù)支持。由于數(shù)據(jù)內(nèi)容中單位名稱、線路名、里程值等存在不規(guī)范的現(xiàn)象,所以需要額外的數(shù)據(jù)清洗工作,規(guī)范數(shù)據(jù)內(nèi)容。
首先,定時從遠端Oracle服務(wù)器采集監(jiān)測數(shù)據(jù)。之后,根據(jù)數(shù)據(jù)的種類、同步頻率和查詢需求,將采集后的數(shù)據(jù)分為晃車儀數(shù)據(jù)和其他檢測數(shù)據(jù)。
對于軌檢超限大值、便攜添乘、人工添乘主表、人工添乘從表、軌檢小車等數(shù)據(jù),數(shù)據(jù)總量最大約為百萬級,增量數(shù)據(jù)較小。采用現(xiàn)有數(shù)據(jù)同步工具DataX,將遠端Oracle數(shù)據(jù)庫同步到本地MySQL中,并設(shè)置定時增量數(shù)據(jù)導(dǎo)入任務(wù)[8]。DataX是阿里巴巴集團內(nèi)被廣泛使用的離線數(shù)據(jù)同步工具/平臺,可實現(xiàn)包括MySQL、Oracle、HDFS、Hive等各種異構(gòu)數(shù)據(jù)源之間高效的數(shù)據(jù)同步功能。同時可集成插件,對同步的數(shù)據(jù)進行定制化開發(fā),完成數(shù)據(jù)清洗功能。
對于晃車儀數(shù)據(jù),總量較大,為千萬級,且隨時在增加。所以,數(shù)據(jù)同步分為全量同步和增量同步。全量同步,是將過去五年內(nèi)所有數(shù)據(jù)一次性導(dǎo)入。這種操作較為耗時,且校驗數(shù)據(jù)完整性復(fù)雜。增量同步是隨著時間變化,將新增數(shù)據(jù)同步到本地數(shù)據(jù)服務(wù)器中。同時,需要做到實時同步,頻率較高,而遠端數(shù)據(jù)庫中新增數(shù)據(jù)的時間和數(shù)量不固定。另外,數(shù)據(jù)內(nèi)容中存在單位名稱、線路名稱等不規(guī)范情況,需要在接入時進行數(shù)據(jù)清洗操作。
根據(jù)晃車數(shù)據(jù)的數(shù)據(jù)量大和查詢復(fù)雜的特點,方便設(shè)計后續(xù)存儲和查詢方案,即將晃車數(shù)據(jù)存儲至Hadoop大數(shù)據(jù)平臺,使用HBase上層查詢引擎Phoenix提升查詢速度。故,在接入全量晃車數(shù)據(jù)時,使用Phoenix組件自帶lib庫的現(xiàn)有數(shù)據(jù)導(dǎo)入工具CsvBulkLoadTool,底層執(zhí)行分布式MapReduce任務(wù)并行導(dǎo)入,并同時對Phoenix二級索引進行更新。經(jīng)測試,Phoenix MR方式導(dǎo)入一千七百萬數(shù)據(jù)耗時10min左右,可快速導(dǎo)入大量數(shù)據(jù),并保證數(shù)據(jù)的完整性。對于增量的晃車數(shù)據(jù)導(dǎo)入,采用數(shù)據(jù)同步工具DataX,定時獲取某個時間段內(nèi)增量數(shù)據(jù)插入到大數(shù)據(jù)集群中,并且在插入到集群之前,集成數(shù)據(jù)清洗插件Transformer,定制化轉(zhuǎn)換數(shù)據(jù)內(nèi)容。
4 數(shù)據(jù)存儲與查詢
對于軌檢超限大值、便攜添乘、人工添乘主表、人工添乘從表、軌檢小車等檢測數(shù)據(jù),數(shù)據(jù)本身總量約為百萬級,增量數(shù)據(jù)較小,采用MySQL存儲,提供查詢服務(wù)。
對于晃車數(shù)據(jù),總量為千萬級,增量相對較大。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫MySQL難以支持?jǐn)?shù)據(jù)的存儲,后期維護也越來越復(fù)雜,急需能夠存儲大量數(shù)據(jù)且查詢速度快的數(shù)據(jù)庫。因此,適合采用分布式大數(shù)據(jù)集群存儲。HBase底層應(yīng)用分布式文件系統(tǒng),在處理龐大表上十分有優(yōu)勢。由于HBase是分布式存儲,為了優(yōu)化存儲性能和后續(xù)查詢性能,防止數(shù)據(jù)傾斜問題,本文采用預(yù)分區(qū)HexStringSplit算法,根據(jù)Rowkey編碼,HBase也會通過算法將其分到不同的Region,實現(xiàn)均勻分布,避免熱點問題。
HBase本身是列存儲,僅能查詢單個字段值,不能滿足業(yè)務(wù)系統(tǒng)對一條數(shù)據(jù)所有字段的詳細查詢需求,而Phoenix可將多列數(shù)據(jù)聚合為行,同時查詢出多個字段值,使用體驗上和關(guān)系型數(shù)據(jù)庫類似。Phoenix是一個開源的HBase SQL層,支持二級索引、事務(wù)以及多種SQL層優(yōu)化。二級索引可大幅度提升數(shù)據(jù)查詢速度。
在創(chuàng)建索引時,根據(jù)業(yè)務(wù)查詢需求,將常用的查詢字段,包括檢測時間、線編號、行別等,加入索引列中。同時,需要使用include語法,將其他未在索引中的字段包含[9]。之后,在查詢過程中即可包含所有字段,滿足對詳細數(shù)據(jù)的查詢需求。隨著Phoenix表中數(shù)據(jù)持續(xù)增加,創(chuàng)建新的索引往往耗費大量時間。索引的底層原理仍是通過HBase特性,建立數(shù)據(jù)表,表的key由多個索引字段構(gòu)成,value是對應(yīng)數(shù)據(jù)的rowkey。因此,隨著數(shù)據(jù)量的增加,索引的存儲量也會增加。如果創(chuàng)建索引的時間超過Phoenix客戶端的固定時間,將出現(xiàn)創(chuàng)建超時的問題。在后續(xù)使用中,如果需要創(chuàng)建其他業(yè)務(wù)相關(guān)的索引時,可以通過Phoenix的lib庫中IndexTool工具,執(zhí)行Mapreduce任務(wù),創(chuàng)建異步索引。另外,在使用Phoenix提高查詢效率時,需要注意時間類型的時區(qū)問題。Phoenix的數(shù)據(jù)類型默認(rèn)時區(qū)是UTC,而日常多用GMT+8時區(qū)。在具體使用時,需要進行時區(qū)的轉(zhuǎn)換操作。
為了進一步提升查詢性能,根據(jù)HBase運行原理,進行修改HBase部分配置。對于HBase的Master,最大內(nèi)存設(shè)置為當(dāng)前機器內(nèi)存的60%左右,最小設(shè)置為2G即可滿足運行需求。對于HBase的RegionServer,內(nèi)存設(shè)置為服務(wù)器內(nèi)存的50%~70%。對于HBase的HFile,設(shè)置hfile.block.cache.size為0.5甚至0.6。同時參考hbase.regionserver.global.memstore.upperlimit,如果兩值加起來超過80%~90%,會有內(nèi)存溢出的風(fēng)險。
5 數(shù)據(jù)共享
對于軌檢超限大值、便攜添乘、人工添乘主表、人工添乘從表、軌檢小車等檢測數(shù)據(jù),數(shù)據(jù)存儲在MySQL中,直接通過MySQL查詢,使用JDBC連接共享至下游工務(wù)車載數(shù)據(jù)分析業(yè)務(wù)系統(tǒng)即可。
對于晃車數(shù)據(jù),存儲于大數(shù)據(jù)集群中,并通過HBase上層組件Phoenix優(yōu)化查詢。在數(shù)據(jù)共享時,雖然Phoenix提供通過JDBC連接的形式訪問數(shù)據(jù),但是,這種方式功能不夠全面,多個系統(tǒng)之間集成交互困難,也不具備權(quán)限驗證功能。因此,采用HTTP接口形式,可以較好地解決不同系統(tǒng)之間的交互需求。在傳輸數(shù)據(jù)時,采用POST方法而不是GET方法,對傳輸數(shù)據(jù)內(nèi)容的大小更寬容。
由于查詢條件不固定,如果根據(jù)不同的查詢請求開發(fā)不同的接口,接口不具有靈活性,開發(fā)周期長,后續(xù)擴展性差。所以,參考常用持久層框架MyBatis,將通用查詢功能總結(jié)為三種,查詢所有詳細信息list、查詢分頁信息page、和查詢數(shù)據(jù)總量count,并將這三種功能開放為3個訪問接口。
在傳遞查詢參數(shù)上,本文封裝了查詢參數(shù)。查詢參數(shù)內(nèi)部包括查詢屬性和分頁屬性。查詢屬性中可包含多個查詢條件。每個查詢條件包括查詢字段、查詢關(guān)系、查詢數(shù)值。分頁屬性包括頁面大小和頁碼。因此,根據(jù)查詢參數(shù),即可組合多種查詢條件,滿足不同需求。
針對具有復(fù)雜業(yè)務(wù)邏輯的聯(lián)表查詢,需要額外的設(shè)計方式。雖然Phoenix本身提供聯(lián)表查詢功能,但是,在實際使用時發(fā)現(xiàn)Phoenix在聯(lián)表查詢時的一些缺陷。比如,聯(lián)表查詢的聯(lián)查條件不能為大于或者小于,只能是等于。隨著聯(lián)表查詢的復(fù)雜度增加,查詢效率也會隨之下降。因此,結(jié)合Phoenix索引查詢效率高的優(yōu)點和Java內(nèi)存處理快的優(yōu)點,本方案根據(jù)實際業(yè)務(wù)邏輯,先從大數(shù)據(jù)集群中,通過索引,以毫秒級速度獲取單一表結(jié)構(gòu)數(shù)據(jù)到內(nèi)存中,然后,以代碼的形式,根據(jù)聯(lián)查條件,從內(nèi)存中使用stream流篩選合適的數(shù)據(jù)。
6 應(yīng)用結(jié)果分析
傳統(tǒng)的業(yè)務(wù)系統(tǒng)存儲數(shù)據(jù)時常用關(guān)系型數(shù)據(jù)庫,例如MySQL、Oracle等。為了提高查詢效率和緩解存儲壓力,本方案通過Phoenix組件,數(shù)據(jù)進行存儲、查詢、共享等流程。本章從存儲壓力和查詢性能兩個方面,對MySQL和Phoenix方式進行對比。
在存儲層面上,對于存儲相同數(shù)據(jù)量的晃車數(shù)據(jù),使用MySQL存儲容量為10.35GB,包含數(shù)據(jù)6.7GB,索引3.65GB。使用HBase存儲容量為10.2GB,包含數(shù)據(jù)5.4GB,索引4.79GB。其中,HBase中的數(shù)據(jù)存儲在HDFS中,副本為3。對于相同的數(shù)據(jù),采用HBase存儲容量略小于MySQL存儲容量;采用HBase存儲數(shù)據(jù)三重備份,容災(zāi)性更強。
在查詢性能上,使用4個測試用例,即根據(jù)里程范圍查詢、根據(jù)報警級別查詢、根據(jù)報警值范圍查詢、根據(jù)線路查詢,分別測試查詢所有明細數(shù)據(jù)list、查詢分頁數(shù)據(jù)page、查詢數(shù)據(jù)總量count的時間,如表1所示。對于MySQL,各個測試用例的查詢時間范圍在0到5秒。對于Phoenix二級索引,大部分測試用例的查詢時間在500毫秒內(nèi),可做到秒級響應(yīng)。
另外,隨著數(shù)據(jù)量的增長,在MySQL中查詢數(shù)據(jù)的時間將逐漸增加,而在HBase中存儲的數(shù)據(jù),借助Phoenix二級索引分布式查詢,查詢速度隨著數(shù)據(jù)量的增加仍然保持恒定。
可得出結(jié)論,相比MySQL,使用HBase分布式數(shù)據(jù)庫更適合存儲晃車數(shù)據(jù),使用相同的存儲容量,HBase可存儲更多數(shù)據(jù),同時三重備份,提高了數(shù)據(jù)容災(zāi)性;使用Phoenix二級索引比MySQL索引平均提升查詢效率為5倍,最高提升18倍,最低提升1.14倍。
7 總結(jié)與展望
本文提出一種針對工務(wù)監(jiān)測數(shù)據(jù)的數(shù)據(jù)同步與清洗、數(shù)據(jù)存儲與查詢、數(shù)據(jù)共享各流程的技術(shù)方案。在數(shù)據(jù)同步與清洗方面,采用數(shù)據(jù)集成工具DataX,將多種監(jiān)測數(shù)據(jù)匯聚接入。對于軌檢超限大值、便攜添乘、人工添乘主表、人工添乘從表、軌檢小車表,使用關(guān)系型數(shù)據(jù)庫MySQL進行數(shù)據(jù)存儲和數(shù)據(jù)查詢。對于晃車數(shù)據(jù),使用分布式存儲HDFS和HBase,使用Phoenix優(yōu)化查詢效率,并針對查詢特點,設(shè)置數(shù)據(jù)共享HTTP接口。本文方案統(tǒng)一管理多種數(shù)據(jù)接入,降低了存儲壓力,提高了查詢效率。方案經(jīng)驗證和試運行,使用便捷、性能出色,具有一定的應(yīng)用和參考價值。
參考文獻:
[1] 何欣玲,劉宇,趙天,等.鐵路數(shù)據(jù)中心基礎(chǔ)設(shè)施管理系統(tǒng)的研究[J].鐵路計算機應(yīng)用,2020,29(10):21-25.
[2] 馬小寧,李平,史天運.鐵路大數(shù)據(jù)應(yīng)用體系架構(gòu)研究[J].鐵路計算機應(yīng)用,2016,25(9):7-13.
[3] 宋一凡,張玉福.鐵路運輸清算系統(tǒng)運行實踐研究[J].鐵道運輸與經(jīng)濟,2013,35(9):38-42.
[4] 衛(wèi)錚錚,單杏花,王洪業(yè),等. 基于客運大數(shù)據(jù)平臺的鐵路客流預(yù)測系統(tǒng)[J]. 鐵路計算機應(yīng)用,2022,31(1):37-42.
[5] 王沛然,馬小寧,王喆,等. 鐵路數(shù)據(jù)服務(wù)平臺存儲架構(gòu)設(shè)計與應(yīng)用[J]. 鐵路計算機應(yīng)用, 2021,30(5):5.
[6] 王萬齊,劉軍,李平,等.京張高鐵運營安全大數(shù)據(jù)平臺設(shè)計及關(guān)鍵技術(shù)[J].鐵路計算機應(yīng)用,2021,30(7):61-65.
[7] 廉小親,楊凱,程智博,等.面向建設(shè)期鐵路大數(shù)據(jù)的分級存儲方法研究[J].鐵路計算機應(yīng)用,2022,31(2):17-22.
[8] 陳宇收.基于Datax的數(shù)據(jù)同步方案研究[J].電腦編程技巧與維護,2018(9):97-98,13.
[9] 劉文東. 基于Phoenix平臺的空間數(shù)據(jù)索引與查詢技術(shù)研究[D].西安電子科技大學(xué),2018.
【通聯(lián)編輯:王力】