康耀龍 馮麗露 張景安
(1.山西大同大學(xué) 計(jì)算機(jī)與網(wǎng)絡(luò)工程學(xué)院 山西省大同市 037009)
(2.山西大同大學(xué) 教育科學(xué)與技術(shù)學(xué)院 山西省大同市 037009 3.山西大同大學(xué)網(wǎng)絡(luò)信息中心 山西省大同市 037009)
我國道路基礎(chǔ)設(shè)施可以說是世界上最完善的國家,道路的復(fù)雜情況也可以說是世界上最復(fù)雜的國家之一。在大量的車流量數(shù)據(jù)中分析和找出超速、事故逃逸等情況,一般的技術(shù)是難以解決的,而且每天車流量不是固定的,車量行駛路線也極其復(fù)雜,所以必須使用大數(shù)據(jù)技術(shù)。本系統(tǒng)使用了現(xiàn)在主流的Apache Spark 分布式計(jì)算引擎對以上問題予以解決。
現(xiàn)實(shí)中道路卡口收集的數(shù)據(jù)是雜亂的、非結(jié)構(gòu)化的,使用傳統(tǒng)模式來存儲數(shù)據(jù)需要對這些數(shù)據(jù)進(jìn)行大量的轉(zhuǎn)換,而且要分離出大量的表,表與表之間存在大量的聯(lián)系,這樣會使本來簡單的描述數(shù)據(jù)變的復(fù)雜,由于表和表的聯(lián)系增多,表查詢的復(fù)雜度會急劇增加;而且數(shù)據(jù)的收集是每分每秒,所以這會是一個海量的數(shù)據(jù),傳統(tǒng)數(shù)據(jù)庫來存儲如此大量的數(shù)據(jù)會使硬件激增,而且總有一天會達(dá)到存儲的閾值,到時需要做數(shù)據(jù)遷移也會是一個巨大的難題。
本系統(tǒng)采用的是分布式文件存儲系統(tǒng)HDFS(Hadoop Distributed File System)。HDFS 具有高容錯的特點(diǎn),而且它部署在大量的普通的計(jì)算機(jī)硬件上,可以說是非常的廉價,但是它又具有超大的存儲量,而且是可以動態(tài)擴(kuò)容,在根本上解決了存儲容量和成本的問題。HDFS 還可以結(jié)合HBase 使用,而HBase 是非結(jié)構(gòu)化數(shù)據(jù)庫,所以非結(jié)構(gòu)化數(shù)據(jù)存儲也迎刃而解。
整個平臺由應(yīng)用層、數(shù)據(jù)層和基礎(chǔ)層實(shí)現(xiàn)。應(yīng)用層是系統(tǒng)的核心層,關(guān)鍵技術(shù)在應(yīng)用層得以實(shí)現(xiàn)。這一層由分布式計(jì)算引擎,將數(shù)據(jù)層的數(shù)據(jù)處理。這些數(shù)據(jù)由Spark Core 進(jìn)行抽取、轉(zhuǎn)換、加載。在這一層中還有數(shù)據(jù)的清洗,因?yàn)樵紨?shù)據(jù)都是一些非結(jié)構(gòu)化,含有臟數(shù)據(jù),難以直接使用的數(shù)據(jù)。這些數(shù)據(jù)按照一定的規(guī)則,比如空數(shù)據(jù)用-1 代替,無效數(shù)據(jù)刪除,還要對外服務(wù)提供接口,進(jìn)行數(shù)據(jù)的轉(zhuǎn)存。數(shù)據(jù)層也是大數(shù)據(jù)中心。這一層提供了非結(jié)構(gòu)化數(shù)據(jù)處理技術(shù)支持,本系統(tǒng)使用的是Apache Spark 1.6。結(jié)合Hive 將數(shù)據(jù)進(jìn)行ETL 處理。本層是數(shù)據(jù)的存儲層,采用的技術(shù)是分布式文件系統(tǒng),對海量數(shù)據(jù)的管理。基礎(chǔ)層也是獲取層。該層的主要作用是結(jié)合道路卡口和電警系統(tǒng)對數(shù)據(jù)進(jìn)行收集,對日志文件的收集。在收集過程中也會進(jìn)行簡單的ETL 操作,本層是數(shù)據(jù)的來源層。系統(tǒng)總體結(jié)構(gòu)如圖1 所示。

圖1:系統(tǒng)總體結(jié)構(gòu)圖
本系統(tǒng)分析的數(shù)據(jù)來自非結(jié)構(gòu)化數(shù)據(jù),并對這些數(shù)據(jù)進(jìn)行處理過后得到結(jié)果,需要將這些結(jié)果存在本地?cái)?shù)據(jù)中,所以需要設(shè)計(jì)一些結(jié)果表,而這些結(jié)果表是根據(jù)后續(xù)的業(yè)務(wù)需求而定的。本系統(tǒng)有四個結(jié)果表,卡口狀態(tài)表、前N 車流量卡口表、前N 車流量卡口詳情表、車輛軌跡表。
道路卡口是數(shù)據(jù)收集的基礎(chǔ)硬件,如果某個或某些卡口發(fā)生故障,而沒有及時排查出來,那么該卡口監(jiān)控的道路將失去聯(lián)系。該模塊主要功能是檢測和排查異常的卡口攝像頭。通過收集的數(shù)據(jù)檢索出正常攝像頭個數(shù)與實(shí)際的攝像頭個數(shù)是否相等,可以判斷有多少攝像頭故障,記錄下異常攝像頭個數(shù)。通過Spark 算子將所有數(shù)據(jù)分別加載到內(nèi)存中,然后將正常的和異常的攝像頭詳細(xì)信息按照一定的規(guī)則拼接到字符串中。將數(shù)據(jù)緩存、入庫以備后面的工程使用。
卡口車流量是確定該路段交通是否繁忙,什么時間段最繁忙,提供數(shù)據(jù)支持,在哪些路段需要增派警力協(xié)助交通管理。本模塊通過上一個模塊的落地?cái)?shù)據(jù)進(jìn)行進(jìn)一步的計(jì)算和分析,經(jīng)過上一輪分析,數(shù)據(jù)不是很大,可以直接加載至內(nèi)存計(jì)算。將所有數(shù)據(jù)加載至內(nèi)存后,使用Spark 算子進(jìn)行迭代運(yùn)算,將每一條數(shù)據(jù)按照一定的規(guī)則切分,得到了每個卡口下經(jīng)過的車輛總數(shù)。然后將每個卡口的車輛總數(shù)進(jìn)行二次排序,得到需要的最高車流量卡口的編號以及具體信息。
卡口車流量分析模塊關(guān)鍵代碼:

該模塊是對最可能發(fā)生事故的路段進(jìn)行數(shù)據(jù)的轉(zhuǎn)存,如何確定哪些路段最可能發(fā)生故障,是這個模塊的關(guān)鍵。最有效的方法是通過機(jī)器學(xué)習(xí)算法做出一個模型,再將每個卡口收集的數(shù)據(jù)帶入該算法模型,進(jìn)行道路預(yù)測。而本系統(tǒng)沒有機(jī)器學(xué)習(xí)功能,所以通過經(jīng)驗(yàn)來確定,也就是車流量最高的路段最容易發(fā)生事故。所以經(jīng)過卡口車流量分析模塊分析后,得到的一系列車流量最多的卡口號。再把這些卡口的數(shù)據(jù)經(jīng)過算子的清洗和切分,就能得到這些卡口所監(jiān)控到的所有的車輛信息。通過Apache Spark 內(nèi)部提供的JDBC 接口將數(shù)據(jù)寫入MySQL 中。
車輛軌跡刻畫模塊是追蹤可疑車輛的最好的方法。在確定某一輛車的車牌之后,就可以根據(jù)該車輛的行動路線確定該車主是否是可疑分子。本模塊先將車牌號加載至廣播變量中,與所有的數(shù)據(jù)進(jìn)行對比,得到一系列的卡口號。再將這些卡口的所有數(shù)據(jù)加載至內(nèi)存中,根據(jù)算子將每個卡口的時間提取出來,然后按照時間的先后順序進(jìn)行二次排序。這樣該車輛經(jīng)過的卡口順序就得到了,最后通過算子將每個卡口號和地域名進(jìn)行字符串的拼接,得到該車輛的軌跡路線。
系統(tǒng)測試是確定該系統(tǒng)是否完成開發(fā),確定它是否存在較大缺陷的最主要的方法。在測試環(huán)境下本系統(tǒng)的總體運(yùn)行情況很穩(wěn)定。模擬現(xiàn)實(shí)卡口數(shù)據(jù)的情況,整個集群在啟動過程中沒有出現(xiàn)問題,通過Apache Spark 官方提供的Web UI 觀察每個應(yīng)用程序和Job 的運(yùn)行情況均沒有錯誤,在數(shù)據(jù)庫中的運(yùn)行結(jié)果的查詢也正確。
本系統(tǒng)使用的Apache Spark 計(jì)算框架,讓車輛檢索的速度更快,可以在幾分鐘內(nèi)檢索海量信息,最快速的發(fā)現(xiàn)問題,對于道路上的緊急情況能夠更快的做出反應(yīng),本系統(tǒng)針對道路上的主要問題給出了解決方案。卡口狀態(tài)分析模塊能夠及時發(fā)現(xiàn)道路基礎(chǔ)設(shè)施是否故障,而且能夠確定哪些路段是事故多發(fā)、繁忙路段,什么時間段是事故的多發(fā)期,從而可以增派警力對這些路段的交通進(jìn)行梳理。車輛軌跡刻畫模塊可以及時發(fā)現(xiàn)可疑車輛,并對可疑車輛進(jìn)行監(jiān)控和定位,幫助警方更快的破案。