王 喆,楊連報,劉宗洋
(中國鐵道科學(xué)研究院集團(tuán)有限公司 電子計算技術(shù)研究所,北京 100081)
近年來,隨著鐵路信息化建設(shè)的逐步深入,系統(tǒng)覆蓋面越來越廣,積累的數(shù)據(jù)量越來越大。據(jù)初步統(tǒng)計,鐵路數(shù)據(jù)總量已達(dá)PB級,日增長量超TB級。同時,隨著物聯(lián)網(wǎng)及傳感器技術(shù)的廣泛應(yīng)用,特別是在鐵路行車安全監(jiān)控領(lǐng)域,積累了大量的結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)[1]。對海量歷史數(shù)據(jù)的分析和挖掘有助于發(fā)現(xiàn)新的業(yè)務(wù)規(guī)律和現(xiàn)象,從而指導(dǎo)業(yè)務(wù)流程的改進(jìn)和創(chuàng)新,做到“強(qiáng)基達(dá)標(biāo)、提質(zhì)增效”。但是,由于鐵路現(xiàn)有信息系統(tǒng)架構(gòu)及硬件平臺能力的限制,鐵路各業(yè)務(wù)系統(tǒng)對歷史數(shù)據(jù)的分析和利用效率不高。因此,依托鐵路數(shù)據(jù)服務(wù)平臺的分布式計算架構(gòu),對海量的鐵路貨車超偏載檢測數(shù)據(jù)進(jìn)行統(tǒng)計分析,實(shí)現(xiàn)分車(運(yùn)輸任務(wù)去重)計算,為后續(xù)開展鐵路貨運(yùn)分析奠定基礎(chǔ)。
為了保證貨車上裝載的貨物不超載、不偏載、不偏重、不集重,貨車運(yùn)輸沿途會設(shè)置許多超偏載檢測裝置對貨車的超偏載情況進(jìn)行檢測[2]。超偏載檢測裝置主要由稱重臺面、傳感器、數(shù)據(jù)采集儀和計算機(jī)等組成[3],一般安裝在車站進(jìn)(出)站信號機(jī)附近。當(dāng)貨車車輛以一定速度通過超偏載檢測設(shè)備時,位于鋼軌底部的壓力傳感器將接受到的壓力變化轉(zhuǎn)成數(shù)字信號傳至計算機(jī),計算得出貨物相關(guān)的數(shù)據(jù),并結(jié)合車號自動識別系統(tǒng)和確報系統(tǒng)在超偏載檢測系統(tǒng)中生成一條記錄,包括當(dāng)前檢測的車輛編號、總重、通過時間、發(fā)到站信息、測點(diǎn)編碼、貨物編碼等。
目前,各鐵路局集團(tuán)公司在主要貨運(yùn)線路上部署了超過290個超偏載檢測點(diǎn),全路貨車車輛保有量超過70萬輛,上述車輛每年途徑各檢測點(diǎn)生成的檢測記錄總數(shù)約1.4億條。假設(shè)一趟運(yùn)輸任務(wù)(從A地到B地)有N輛車組成,并途經(jīng)M個檢測點(diǎn),在不考慮設(shè)備失效的情況下該趟運(yùn)輸任務(wù)會生成N×M條檢測記錄。鐵路貨車超偏載檢測示意圖如圖1所示。
分車計算需要從這N×M條記錄中去除重復(fù)代表同一趟運(yùn)輸任務(wù)的多條記錄,并找出參與本次運(yùn)輸任務(wù)的車輛編號集合。分車計算的結(jié)果是實(shí)現(xiàn)貨運(yùn)運(yùn)量統(tǒng)計、始到站(起點(diǎn)站—終點(diǎn)站組合)發(fā)送貨物頻次和運(yùn)量統(tǒng)計、超偏載檢測設(shè)備性能評估等計算的基礎(chǔ)和前提。
圖1 鐵路貨車超偏載檢測示意圖Fig.1 Freight train overload and unbalance load detecting system
全路超偏載檢測信息最終匯集在貨運(yùn)計量系統(tǒng)的超偏載子系統(tǒng)中,數(shù)據(jù)存儲在Oracle數(shù)據(jù)庫中。該數(shù)據(jù)庫的車輛檢測信息表中記錄了每輛車經(jīng)過檢測點(diǎn)時的檢測記錄。超偏載車輛信息表部分信息如表1所示。研究選取全路2014—2016年的超偏載檢測記錄,數(shù)據(jù)量約4億條。
分車計算就是將一定時間范圍內(nèi),從A站到B站之間多個檢測點(diǎn)對若干輛車檢測的記錄中識別出相互不重復(fù)的運(yùn)輸任務(wù),并且輸出每趟運(yùn)輸所使用的車輛編號序列。計算方案如下。
(1)將所有記錄按照不同車輛編號分組,在同一分組內(nèi)再按照相同始發(fā)站、終到站分組,一共分成若干組。
(2)對每一組相同車輛編號、始發(fā)站、終到站的記錄集按照檢測時間升序排序。
(3)從分組的記錄集中識別出A站到B站所經(jīng)過的檢測點(diǎn)序列SAB。相同始到站檢測點(diǎn)序列示意圖如圖2所示。
表1 超偏載車輛信息表部分信息Tab.1 Partial information of vehicle table of overload and unbalance load detecting system
(4)以SAB序列為判斷依據(jù)重新遍歷記錄集,將記錄集分割成不同的運(yùn)輸任務(wù),結(jié)束。
圖2 相同始到站檢測點(diǎn)序列示意圖Fig.2 Diagram of the detection points sequence with same starting and destination point
該計算方案大體分作2個階段,第一階段分析得到A,B兩站之間的檢測點(diǎn)經(jīng)路序列;第二階段依據(jù)該序列進(jìn)行運(yùn)輸任務(wù)識別。考慮到任意A,B兩站之間的檢測點(diǎn)序列為有限多個且在相當(dāng)長的時間范圍內(nèi)不會發(fā)生變化,因而該方案的優(yōu)點(diǎn)是使用該序列作為判斷依據(jù)識別運(yùn)輸任務(wù)準(zhǔn)確性較高。同時,由于該方案需要多次在海量記錄集上的分組、排序、遍歷等操作,對軟硬件性能要求較高??紤]到使用傳統(tǒng)的Oracle數(shù)據(jù)庫結(jié)合SQL查詢實(shí)現(xiàn)上述計算方案在時間開銷上無法接受,研究利用大數(shù)據(jù)平臺的分布式存儲和計算架構(gòu)解決上述問題。
鐵路數(shù)據(jù)服務(wù)平臺以整合、集成成熟的開源大數(shù)據(jù)平臺技術(shù)組件(Hadoop),采用分布式文件存儲、分布式計算框架(MapReduce),以及分布式內(nèi)存計算框架(Spark) 等開源產(chǎn)品或技術(shù),同時利用統(tǒng)一目錄、統(tǒng)一權(quán)限等實(shí)現(xiàn)完善的安全控制和數(shù)據(jù)管理功能[4-5]。鐵路數(shù)據(jù)服務(wù)平臺技術(shù)架構(gòu)如圖3所示。
數(shù)據(jù)集成模塊能夠?qū)崿F(xiàn)結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)的實(shí)時、非實(shí)時的采集。利用數(shù)據(jù)集成模塊的結(jié)構(gòu)化數(shù)據(jù)采集功能(StreamSets)從超偏載檢測Oracle數(shù)據(jù)庫中批量采集了3年的歷史記錄約4億條,并存儲在開源數(shù)據(jù)倉庫(Hive)中。
結(jié)合開源數(shù)據(jù)倉庫自身的特點(diǎn),分車計算的具體實(shí)現(xiàn)步驟如下。
(1)數(shù)據(jù)清洗。車輛檢測數(shù)據(jù)表中車輛編號、始到站名稱、檢測點(diǎn)編號是判斷和分組的重要依據(jù)。因此,數(shù)據(jù)條目中凡是上述字段為空的皆為無效數(shù)據(jù)。對原始的4億條數(shù)據(jù)進(jìn)行清洗后,余下約3.4億條有效數(shù)據(jù),將清洗完成的數(shù)據(jù)另存新表A。
(2)數(shù)據(jù)粗加工。在新表A中,對車輛編號進(jìn)行分組并按照時間升序排序。針對每一個車號順次掃描數(shù)據(jù),處理原則如下:①當(dāng)遇到前后兩行始到站信息不一樣時,可判斷前一條記錄為一趟運(yùn)輸,將該記錄寫入新表B;②當(dāng)前后兩行始到站一致但貨物不一致時,可判斷前一段記錄為一趟運(yùn)輸,將該記錄寫入新表B;③當(dāng)前后兩行始到站和貨物信息都一致時,繼續(xù)向下搜索直到找到始到站不一樣的記錄,之前的記錄都存入臨時表C。
(3)經(jīng)路序列處理。在表A中,按照相同的始到站進(jìn)行分組,對每一對始到站,利用算法A1(探測點(diǎn)序列生成算法)產(chǎn)生當(dāng)前始到站之間的探測點(diǎn)經(jīng)路序列,將該結(jié)果存入字典表D。算法A1說明如表2所示。
(4)產(chǎn)出結(jié)果。遍歷臨時表C,對每一組車號、始到站相同的記錄集進(jìn)行遍歷,結(jié)合字典表D,利用算法A2(探測點(diǎn)序列識別算法)識別相對獨(dú)立的任務(wù)序列。每趟任務(wù)只保留一次探測記錄并寫入表B,表B即為分車計算的結(jié)果數(shù)據(jù)表。算法A2說明如表3所示。
圖3 鐵路數(shù)據(jù)服務(wù)平臺技術(shù)架構(gòu)Fig.3 Technology architecture of railway data service platform
參與計算的鐵路數(shù)據(jù)服務(wù)平臺部署于某單位內(nèi)網(wǎng)中,集群規(guī)模為24臺服務(wù)器。為了充分發(fā)揮鐵路數(shù)據(jù)服務(wù)平臺集群運(yùn)算的優(yōu)勢,整個計算過程在平臺上使用Spark SQL對Hive中結(jié)構(gòu)化數(shù)據(jù)進(jìn)行分析。Spark抽象出分布式內(nèi)存存儲結(jié)構(gòu)彈性分布式數(shù)據(jù)集RDD進(jìn)行數(shù)據(jù)的存儲[6-7],考慮到分車計算需要大量的數(shù)據(jù)聚合運(yùn)算,在使用Scala實(shí)現(xiàn)時,在UDAF(User De fined Aggregate Function)的派生類中重寫了對DataFrame (升級版RDD)操作的各方法[8]。經(jīng)實(shí)際測試,對清洗后的3.4億條數(shù)據(jù)進(jìn)行分車計算操作耗時約12 min,大大優(yōu)于使用傳統(tǒng)關(guān)系型數(shù)據(jù)庫統(tǒng)計的方法。
表2 算法A1說明Tab.2 Explanation of algorithm A1
表3 算法A2說明Tab.3 Explanation of algorithm A2
通過對3年超偏載檢測歷史數(shù)據(jù)的分車計算,原始數(shù)據(jù)4億條(有效數(shù)據(jù)3.4億條)經(jīng)過運(yùn)輸任務(wù)去重后得到結(jié)果數(shù)據(jù)約6 000萬條。對結(jié)果數(shù)據(jù)的正確性驗(yàn)證同時采用了2種方案。方案一:宏觀驗(yàn)證,即基于分車得到的結(jié)果數(shù)據(jù)進(jìn)行運(yùn)輸任務(wù)統(tǒng)計,如2015年全路貨物品類發(fā)送量排名、十大發(fā)貨地排名、逐月貨物發(fā)送量等;將統(tǒng)計結(jié)果同網(wǎng)絡(luò)上公開發(fā)表的同樣指標(biāo)的數(shù)據(jù)進(jìn)行比較,考察宏觀層面的準(zhǔn)確率。方案二:細(xì)節(jié)驗(yàn)證,即編寫SQL腳本在Oracle平臺上對一段時間內(nèi)(數(shù)據(jù)記錄在百萬條量級,計算能力可接受范圍內(nèi))的檢測記錄進(jìn)行分車操作,充分利用關(guān)系型數(shù)據(jù)庫增刪改查的能力,生成最終結(jié)果集。將該結(jié)果集作為參照集同鐵路數(shù)據(jù)服務(wù)平臺生成的結(jié)果集進(jìn)行對比,得到結(jié)果匹配度。
經(jīng)對比,方案一的結(jié)果完全同現(xiàn)有公開數(shù)據(jù)匹配;方案二選取2015年1—3月鐵路貨運(yùn)發(fā)送量按品類排序與超偏載計算記錄數(shù)進(jìn)行對比,匹配程度為96%。2種驗(yàn)證方案的最終結(jié)果充分證明分車計算方案的正確性,并且性能優(yōu)勢明顯。
利用鐵路數(shù)據(jù)服務(wù)平臺存儲和計算的優(yōu)勢進(jìn)行超偏載檢測數(shù)據(jù)的統(tǒng)計分析,不僅實(shí)現(xiàn)了分車計算,從海量結(jié)構(gòu)化數(shù)據(jù)中去除了影響后續(xù)統(tǒng)計業(yè)務(wù)的重復(fù)運(yùn)輸任務(wù),還得到了許多有價值的結(jié)果數(shù)據(jù),如各貨運(yùn)站之間檢測點(diǎn)序列,全路各相鄰檢測點(diǎn)之間行車平均時長,檢測點(diǎn)稱重誤差范圍等。這些結(jié)果數(shù)據(jù)對后續(xù)超偏載檢測設(shè)備的狀態(tài)判定有著重要價值,從而更加有效地保障鐵路行車安全。下一步應(yīng)充分考慮鐵路大數(shù)據(jù)建設(shè)架構(gòu)中“平臺+應(yīng)用”的模式,以鐵路數(shù)據(jù)服務(wù)平臺為基礎(chǔ),將研究的各項計算包裝成微應(yīng)用部署于平臺之上,更方便地服務(wù)于業(yè)務(wù)部門數(shù)據(jù)分析人員,提供更靈活、更快速響應(yīng)、更具擴(kuò)展性的服務(wù)。