張博
摘要:隨著汽車保有量的不斷增長,城市交通網(wǎng)絡(luò)也變得日益臃腫。如何實時準確地掌握交通現(xiàn)狀,減少交通擁堵,提高出行效率,是智慧交通的核心所在。該文針對傳統(tǒng)車輛分析平臺實時性較差、呈現(xiàn)方式不直觀等缺點,設(shè)計了一種基于大數(shù)據(jù)實時流式處理技術(shù)的三維展示系統(tǒng)。系統(tǒng)分為數(shù)據(jù)采集、數(shù)據(jù)分發(fā)、實時處理以及三維展示幾個部分。為保證系統(tǒng)并發(fā)量,采用高吞吐量的Kafka作為數(shù)據(jù)分發(fā)模塊,同時引入Storm對Kafka中數(shù)據(jù)進行消費、處理,通過WebSocket推送至Web頁面,頁面采用WebGL技術(shù)將車輛數(shù)據(jù)實時展示。與傳統(tǒng)系統(tǒng)相比,該系統(tǒng)具有高吞吐、低延時、準確直觀等特點,可幫助解決一系列交通問題。
關(guān)鍵詞:實時處理;三維;Storm;WebGL
中圖分類號:TP311? ? ? 文獻標識碼:A? ? ? 文章編號:1009-3044(2018)31-0101-03
1 背景
社會的飛速發(fā)展促進了城市車輛的需求增加,隨之帶來了車輛數(shù)據(jù)的爆發(fā)式增長。我們雖可借助Hadoop相關(guān)技術(shù)完成車輛數(shù)據(jù)的大規(guī)模處理,但是分批次處理作業(yè)的模式使得其很難實現(xiàn)秒級的延時。針對批量處理數(shù)據(jù)存在的問題,實時處理方式應(yīng)運而生。
Twitter的Storm是一個開源的實時流式計算框架,比其他流計算產(chǎn)品更具優(yōu)勢。該文基于Storm設(shè)計并實現(xiàn)了一種車輛實時展示系統(tǒng),可實時處理并展示大量車輛數(shù)據(jù)。
2 相關(guān)技術(shù)
2.1 Storm流式處理框架
Storm是一套分布式、可靠、可容錯的用于處理流式數(shù)據(jù)的框架,其流式處理作業(yè)被分發(fā)至不同類型的組件,每個組件負責(zé)一項簡單的、特定的處理任務(wù)。相對于Hadoop,Storm能夠?qū)崿F(xiàn)可靠的無邊界流式數(shù)據(jù)的實時處理,彌補了Hadoop批處理所不能滿足的實時要求。同時,Storm還具有以下幾個特點:
1)編程簡單:開發(fā)人員只需要關(guān)注應(yīng)用邏輯,類似于Hadoop提供的Map和Reduce原語,Storm也對數(shù)據(jù)的實時計算提供了簡單Spout和Bolt原語。
2)高性能,低延遲:相比較批處理框架,可毫秒級響應(yīng)數(shù)據(jù)。
3)分布式:可以輕松應(yīng)對單個節(jié)點無法處理的海量數(shù)據(jù)。
4)可擴展:Storm的處理作業(yè)是分布在多個節(jié)點之間,隨著數(shù)據(jù)量和計算量的增長,可水平擴展系統(tǒng)。
5)容錯:如果某個節(jié)點出現(xiàn)故障,主節(jié)點會將任務(wù)重新分配至其他可用節(jié)點。
6)消息不丟失:Storm會保證每條消息均被處理,如果失敗,會嘗試重新處理此消息。
2.2 WebGL
WebGL是一種3D繪圖協(xié)議,這種繪圖技術(shù)標準允許把JavaScript和OpenGL ES 2.0結(jié)合在一起,從而為HTML5 Canvas提供硬件3D加速渲染,這樣Web開發(fā)人員就可以借助系統(tǒng)顯卡來在瀏覽器里更流暢地展示3D場景和模型,還能創(chuàng)建復(fù)雜的導(dǎo)航和數(shù)據(jù)視覺化。WebGL技術(shù)標準免去了開發(fā)網(wǎng)頁專用渲染插件的麻煩,可被用于創(chuàng)建具有復(fù)雜3D結(jié)構(gòu)的網(wǎng)站頁面,甚至可以用來設(shè)計3D網(wǎng)頁游戲等等。
3 系統(tǒng)設(shè)計
根據(jù)系統(tǒng)需求,對系統(tǒng)進行分層設(shè)計,主要包括數(shù)據(jù)采集、數(shù)據(jù)分發(fā)、實時處理以及三維展示,系統(tǒng)架構(gòu)如圖1所示。
1)數(shù)據(jù)采集:前端設(shè)備所采集到的車輛原始數(shù)據(jù)。
2)數(shù)據(jù)轉(zhuǎn)發(fā):Kafka順序存儲了采集設(shè)備發(fā)送來的消息,并按不同Topic分類,等待著Storm進行拉取消費。
3)實時處理:Storm消費Kafka中數(shù)據(jù),并進行數(shù)據(jù)標準化、數(shù)據(jù)推送、數(shù)據(jù)存儲等幾個步驟。
4)三維展示:Web頁面接收到WebSocket推送的數(shù)據(jù)后,實時繪制車輛。
4 系統(tǒng)實現(xiàn)
4.1 數(shù)據(jù)采集
數(shù)據(jù)采集層主要功能為匯聚前端采集設(shè)備的原始數(shù)據(jù),并通過TCP長連接將數(shù)據(jù)推送至Kafka集群中。在發(fā)送消息之前,會對消息進行分類,即指定Topic。在發(fā)送消息的過程中,加入了監(jiān)聽、異常處理等機制,避免數(shù)據(jù)重發(fā)、漏發(fā),保證數(shù)據(jù)準確性。
4.2 數(shù)據(jù)分發(fā)
數(shù)據(jù)分發(fā)層向下接收采集設(shè)備推送的海量數(shù)據(jù),向上又要及時為高性能、低延時的Storm集群提供數(shù)據(jù),因此對消息框架的吞吐能力有很高要求。最終該系統(tǒng)采用Kafka作為數(shù)據(jù)分發(fā)層的實現(xiàn)。Kafka是一個高吞吐量的分布式發(fā)布訂閱消息系統(tǒng)。類比Kafka官網(wǎng)圖例,數(shù)據(jù)分發(fā)層結(jié)構(gòu)如圖2所示。
一個Kafka集群會包含producer,broker,consumer等角色。broker為消息中間處理節(jié)點,一個Kafka節(jié)點就是一個broker,多個broker組成了Kafka集群。producer為生產(chǎn)者,負責(zé)發(fā)布消息到broker,對于該系統(tǒng),采集設(shè)備即為producer。consumer為消費者,向broker讀取、消費消息,該系統(tǒng)中的consumer為Storm集群。
在數(shù)據(jù)分發(fā)層與實時處理層之間,還有一層分布式協(xié)調(diào)服務(wù)Zookeeper。通過Zookeeper的集群協(xié)調(diào),可以充分保證大型集群的良好運行。
4.3 實時處理
實時處理層會不停去拉取、消費Kafka中的數(shù)據(jù),并對多種Topic類別的數(shù)據(jù)進行標準化、推送、入庫等處理。為應(yīng)對海量數(shù)據(jù)的高并發(fā),該系統(tǒng)并沒有使用傳統(tǒng)的JAVA多線程等方式,而是采用了Storm實時流處理系統(tǒng)。類似Hadoop集群,Storm也有一些基本組件。Storm集群分為控制節(jié)點(Master)和工作節(jié)點(Worker),在這兩種節(jié)點上分別運行著后臺程序Nimbus和Supervisor。Nimbus負責(zé)分配任務(wù)(也就是Topology)給各個工作節(jié)點,Supervisor則負責(zé)管理每個具體的工作節(jié)點。實際在工作節(jié)點上運行的是Spout或Bolt。系統(tǒng)中Storm的處理流程如圖3所示。
Spout從外部源讀取數(shù)據(jù),并用Storm中的數(shù)據(jù)結(jié)構(gòu)Tuple將數(shù)據(jù)發(fā)給Bolt,Bolt為邏輯處理單元,進行一系列處理后,再調(diào)用emit()方法將數(shù)據(jù)以Tuple格式發(fā)射出去。
在該系統(tǒng)中,KafkaSpout為數(shù)據(jù)源,它從Kafka集群中讀取消息,并發(fā)送給carNormalizerBolt;因為數(shù)據(jù)來源于Kafka中的不同Topic,格式有所不同,所以在carNormalizerBolt里做數(shù)據(jù)標準化的處理。我們定義一個標準的Car類JavaBean,將消息的各個字段賦值給Car類,并進行字段補全或是丟棄等異常處理,之后將Car類發(fā)射給carSourceBolt;在carSourceBlot里,主要調(diào)用http接口將Car類發(fā)送至頁面對應(yīng)的Web后臺,同時將Car類發(fā)射給carSaveBolt;carSaveBolt通過獲得數(shù)據(jù)庫連接池中的實例,將Car類持久化存儲至MySQL數(shù)據(jù)庫,方便Web頁面查詢展示。
構(gòu)建處理流程的拓撲代碼如下:
//配置Kafka集群信息
BrokerHosts brokerHost = new ZkHosts(zkHost);
SpoutConfig carSpoutConfig = new SpoutConfig(brokerHost, carTopic, zkRoot, "data-car");
carSpoutConfig.scheme = new SchemeAsMultiScheme(new StringScheme());
//使用Kafka數(shù)據(jù)源作為Spout
KafkaSpout carSpout = new KafkaSpout(carSpoutConfig);
//新建一個Topology
TopologyBuilder builder = new TopologyBuilder();
//建立拓撲結(jié)構(gòu)
builder.setSpout("kafkaCarSpout", carSpout, 3);
builder.setBolt("carNormalizerBolt", new CarNormalizerBolt(), 2)
.shuffleGrouping("kafkaCarSpout");
builder.setBolt("carSourceBolt", new CarSourceBolt(),2)
.shuffleGrouping("carNormalizerBolt");
builder.setBolt("carSaveBolt", new CarSaveBolt(), 2)
.shuffleGrouping("carSourceBolt");
4.4 三維展示
為能更準確、直觀的展示實際路況的車輛信息、流量信息等,展示層通過WebGL模擬實際的三維場景,并實時繪制車輛。系統(tǒng)展示層采用B/S架構(gòu),前后端分離設(shè)計。展示層邏輯如圖4所示。
Storm集群將標準化的數(shù)據(jù)以Http接口方式傳遞給后臺,后臺程序接收到數(shù)據(jù)后,通過WebSocket把數(shù)據(jù)推送至前端頁面。js腳本取得數(shù)據(jù)后,調(diào)用車輛繪制接口完成實時展示功能。繪制接口由WebGL相關(guān)js封裝成類,向外提供。同時,頁面還具有查詢功能,即通過調(diào)用后臺接口,將Storm集群存儲至MySQL的數(shù)據(jù)以表格方式展現(xiàn)。
5 系統(tǒng)測試
通過系統(tǒng)測試,我們可以與系統(tǒng)的需求進行比較,從而發(fā)現(xiàn)系統(tǒng)的缺陷與不足。
5.1 功能測試
首先進行功能測試。功能測試主要有兩點:
1)測試系統(tǒng)是否能從采集設(shè)備獲取到車輛數(shù)據(jù),并通過Storm標準化并實時展示在三維場景中。登錄系統(tǒng),等待三維場景加載完成后,采集到的車輛信息(如車型、車輛顏色等)實時展示在場景中,功能截圖如圖5。
2)測試系統(tǒng)是否能從MySQL數(shù)據(jù)庫中查詢到采集的車輛數(shù)據(jù)。在頁面中選擇時間段、車輛類型、采集設(shè)備等相關(guān)條件,點擊查詢,即可查到采集的車輛數(shù)據(jù)。數(shù)據(jù)查詢結(jié)果界面如圖6。
從功能測試結(jié)果來看,該系統(tǒng)已完成了匯聚采集設(shè)備數(shù)據(jù)、標準化數(shù)據(jù)并實時三維展示、數(shù)據(jù)存入數(shù)據(jù)庫并可查詢等一系列功能。
5.2 性能測試
通過查看Storm集群提供的性能監(jiān)測頁面我們可以發(fā)現(xiàn),kafkaCarSpout、carNormalizerBolt、carSourceBolt及carSaveBolt處理每條Tuple的速度分別為3.29ms、1.16ms、0.38ms和0.73ms,如圖7所示??梢奡torm能以10ms內(nèi)的響應(yīng)速度處理采集設(shè)備的每條采集數(shù)據(jù)。
6 總結(jié)與展望
該文主要介紹在海量數(shù)據(jù)的應(yīng)用背景下,如何利用大數(shù)據(jù)技術(shù)解決傳統(tǒng)車輛分析平臺存在的問題。最終,該文采用Kafka、Storm等大數(shù)據(jù)框架傳輸、處理數(shù)據(jù),通過WebGL對道路車輛的實時繪制,為大數(shù)據(jù)車輛分析,緩解擁堵等決策提供有力支持。
參考文獻:
[1] 楊杰, 朱邦培, 吳宏偉. 基于Storm的高速公路實時交通指數(shù)評估方法的研究與實現(xiàn)[J]. 計算機應(yīng)用研究, 2017, 34(9): 2707-2713.
[2] 亓開元, 趙卓峰, 房俊, 等. 針對高速數(shù)據(jù)流的大規(guī)模數(shù)據(jù)實時處理方法[J]. 計算機學(xué)報, 2012, 35(3):? 476-490.
[3] 王雅瓊, 楊云鵬, 樊重俊. 智慧交通中的大數(shù)據(jù)應(yīng)用研究[J]. 物流工程與管理, 2015, 37(5): 107-108.
[4] 張春風(fēng), 申飛, 張俊, 等. 基于 Storm 的車聯(lián)網(wǎng)數(shù)據(jù)實時分析系統(tǒng). 計算機系統(tǒng)應(yīng)用, 2018, 27(3): 44-50.
[5] Maarala AI, Rautiainen M, Salmi M. et al. Low latency analytics for streaming traffic data with Apache Spark[C]. IEEE International Conference on Big Data. Santa Clara, CA, USA.2015: 2855-2858.