干貨 | 智能網(wǎng)聯(lián)汽車大數(shù)據(jù)基礎(chǔ)平臺(tái)構(gòu)建研究
各位老師大家上午好,我們組的題目是智能網(wǎng)聯(lián)汽車大數(shù)據(jù)基礎(chǔ)平臺(tái)的構(gòu)建。我們的指導(dǎo)企業(yè)是西部智聯(lián)。我們的匯報(bào)將從這五個(gè)方面進(jìn)行展開,第一個(gè)方面是項(xiàng)目背景與需求分析。
智能網(wǎng)聯(lián)汽車是推進(jìn)智慧交通發(fā)展,實(shí)現(xiàn)智慧城市建設(shè)的重要一環(huán),也是國(guó)際公認(rèn)的未來(lái)發(fā)展方向,也是我們中國(guó)能夠?qū)崿F(xiàn)汽車工業(yè)轉(zhuǎn)型、形成國(guó)際競(jìng)爭(zhēng)力的一個(gè)重要機(jī)遇。因此,重慶市政府西部科學(xué)城、重慶高新區(qū)管委會(huì)和我們學(xué)校的李克強(qiáng)教授團(tuán)隊(duì)共同策劃成立了智能網(wǎng)聯(lián)汽車領(lǐng)域的研發(fā)機(jī)構(gòu)——西部科學(xué)城智能網(wǎng)聯(lián)汽車創(chuàng)新中心。西部智聯(lián)也是廣泛開展業(yè)務(wù),推進(jìn)產(chǎn)業(yè)協(xié)同發(fā)展,促進(jìn)智能網(wǎng)聯(lián)汽車產(chǎn)業(yè)的規(guī)模化落地。
智能網(wǎng)聯(lián)汽車云控平臺(tái)的用戶主要是普通車主、政府以及企業(yè)用戶三個(gè)部分。普通車主的需求主要是解決應(yīng)用協(xié)同的問題,保證體驗(yàn)感。對(duì)于政府的話,主要是要統(tǒng)籌整個(gè)交通的管理與控制,對(duì)于企業(yè)用戶的話是利用數(shù)據(jù)賦能推進(jìn)產(chǎn)業(yè)研發(fā)的瓶頸。因此我們就需要不斷建立健全車端云、邊緣云、區(qū)域云、全國(guó)云四級(jí)的支撐體系。
對(duì)于市場(chǎng)前景的話,智能交通市場(chǎng)未來(lái)的發(fā)展也在持續(xù)增長(zhǎng),整個(gè)市場(chǎng)規(guī)模也是非常巨大的,車路云一體化是實(shí)現(xiàn)整個(gè)智慧交通商業(yè)化落地的一個(gè)最可行的方案。因此我國(guó)也正在大力推動(dòng)智能網(wǎng)聯(lián)汽車示范區(qū)的建設(shè)。提出到2025年,智能網(wǎng)聯(lián)汽車將會(huì)覆蓋全國(guó)的所有城市。
小米還有集度汽車也采用Flink和Kafka進(jìn)行了一些數(shù)據(jù)集成的實(shí)踐,我們也建立了北京亦莊自動(dòng)駕駛示范區(qū)以及國(guó)家智能網(wǎng)聯(lián)汽車長(zhǎng)沙測(cè)試區(qū),實(shí)現(xiàn)了智慧公交、自動(dòng)駕駛出租車等應(yīng)用。
接下來(lái)我來(lái)介紹一下整個(gè)系統(tǒng)的設(shè)計(jì)架構(gòu)。首先,在數(shù)據(jù)傳輸階段,我們采用了MQTT協(xié)議進(jìn)行消息的發(fā)布,還有訂閱提供一對(duì)多的消息發(fā)布。在數(shù)據(jù)處理分發(fā)的方面,我們首先采用了Apache Nifi用于可視化的實(shí)時(shí)整理數(shù)據(jù)流動(dòng),整合數(shù)據(jù)的總線,接著運(yùn)用了Kafka對(duì)數(shù)據(jù)進(jìn)行分發(fā),分發(fā)給不同的消費(fèi)者。在數(shù)據(jù)分析方面,我們采用了Apache Flink進(jìn)行有狀態(tài)的計(jì)算,接著把數(shù)據(jù)分析后的數(shù)據(jù)傳入一個(gè)TimescaleDB里面。TimescaleDB是基于postgreSQL數(shù)據(jù)庫(kù)打造的一個(gè)時(shí)序數(shù)據(jù)庫(kù)。數(shù)據(jù)可以自動(dòng)按照時(shí)間和空間進(jìn)行一個(gè)分區(qū)。在數(shù)據(jù)應(yīng)用方面,我們運(yùn)用了Apache的Superset進(jìn)行可視化,因?yàn)樗梢灾С侄喾N的數(shù)據(jù)庫(kù),包括連接我們之前用到的TimescaleDB數(shù)據(jù)庫(kù)。
我們整體的系統(tǒng)的架構(gòu)如上圖所示。除了上述講到的一些技術(shù)以外,在第一部分的數(shù)據(jù)接入,我們采用的數(shù)據(jù)是企業(yè)提供的一個(gè)RCU路端數(shù)據(jù),還有一個(gè)OBU的云車端的數(shù)據(jù),然后采用了TCP協(xié)議進(jìn)行通信,然后運(yùn)用EMQX的引擎進(jìn)行數(shù)據(jù)的接入?;谶@個(gè)系統(tǒng)框架,我們進(jìn)行后續(xù)的開發(fā)實(shí)踐。
下面我來(lái)介紹一下技術(shù)實(shí)現(xiàn)的部分。首先是我們開發(fā)工作的基礎(chǔ),我們開發(fā)工作是基于三臺(tái)華為云的Linux機(jī)器,這里非常感謝企業(yè)導(dǎo)師的支持。然后初始機(jī)的環(huán)境的配置、開發(fā)用的數(shù)據(jù)主要是導(dǎo)師提供的靜態(tài)數(shù)據(jù),一共是40萬(wàn)條,還有數(shù)據(jù)源的模擬程序,所以最終的動(dòng)態(tài)數(shù)據(jù)的量級(jí)可以達(dá)到千萬(wàn)的量級(jí)。導(dǎo)師也提供了一個(gè)數(shù)據(jù)交互規(guī)范,供我們進(jìn)行參考。
數(shù)據(jù)源程序是使用GO語(yǔ)言進(jìn)行開發(fā)的,我們是使用的MQTT的TCP協(xié)議進(jìn)行傳輸,模擬實(shí)際的數(shù)據(jù)。單個(gè)程序的數(shù)據(jù)源是10赫茲,我們發(fā)送的是一個(gè)序列化的Json數(shù)據(jù),但這個(gè)程序可以啟動(dòng)多個(gè)進(jìn)程,可以模擬多車多路側(cè)單元。我們?cè)O(shè)計(jì)的QoS是0,最多分發(fā)一次,這樣網(wǎng)絡(luò)負(fù)載比較低,雖然數(shù)據(jù)有可能會(huì)丟失,但是對(duì)我們整個(gè)實(shí)驗(yàn)沒有什么太大的影響,下面是一個(gè)這個(gè)數(shù)據(jù)的示例。
然后是EMQX的部署,這個(gè)部署就比較簡(jiǎn)單。需要說明的是EMQX安裝在服務(wù)器上,所以需要考慮到網(wǎng)絡(luò)安全的問題,所以我們最終還是沒有對(duì)公網(wǎng)進(jìn)行開放,我們把端口轉(zhuǎn)發(fā)到本地進(jìn)行調(diào)試。右上角就是我們安裝完之后的dashboard,我們可以在里面很輕松地看到每秒傳入和傳出的信息量。
接下來(lái)是NiFi和Kafka兩個(gè)部分,Kafka需要特別注意一下,因?yàn)槲覀兒罄m(xù)是在不同的機(jī)器上進(jìn)行流式計(jì)算,所以我們需要在局域網(wǎng)內(nèi)其他機(jī)器去訪問Kafka,所以我們還需要修改一下相關(guān)的監(jiān)聽地址。然后就是NiFi的配置,這個(gè)配置主要是兩個(gè)方面,一個(gè)是連接EMQX,是一個(gè)MQTT的消費(fèi)者,然后是連接Kafka,它是一個(gè)Kafka brokers,是一個(gè)生產(chǎn)者。我們通過同樣的方式訂閱了OBU所有的信息,把數(shù)據(jù)直接傳輸?shù)終afka中。
關(guān)于Flink的部署,我們?cè)诜?wù)器端主要也是考慮到負(fù)載平衡和數(shù)據(jù)吞吐的一些原因,把之前網(wǎng)絡(luò)密集型的放在了服務(wù)器一上,現(xiàn)在這個(gè)計(jì)算密集型的我們就安裝在了服務(wù)器二。導(dǎo)師推薦的java環(huán)境是JDK1.8,所以我們就用了之前的Flink 1.14.6版本。在本地也需要同樣配置一個(gè)java開發(fā)環(huán)境,maven的一個(gè)倉(cāng)庫(kù),添加一個(gè)相關(guān)的價(jià)包,然后就可以用這個(gè)Flink的流處理模板去進(jìn)行開發(fā)了。右下角是我們做的Kafka source示例,主要是添加一下相關(guān)的地址信息和訂閱的主題,就可以獲得相關(guān)的一些offset,配置一下反序列化的方法就可以了。
之后是TimescaleDB的連接,主要是我們需要設(shè)計(jì)一個(gè)存儲(chǔ)表,我們是用的JDBC Sink,然后把Flink的計(jì)算結(jié)果直接存到TimescaleDB中。后面我們驗(yàn)證了一下這個(gè)數(shù)據(jù)庫(kù)連接是否成功,我們?cè)趐ostgres admin中直接查看數(shù)據(jù)的結(jié)果,可以看到它已經(jīng)成功存入到數(shù)據(jù)中了。
然后是Superset和它的連接,我們是用的這種容器化的部署方式,就是用docker去部署,但是這個(gè)其實(shí)有一些問題,因?yàn)槿菀壮霈F(xiàn)網(wǎng)絡(luò)訪問的問題,它需要訪問速手機(jī)局域網(wǎng)內(nèi)的一個(gè)其他的服務(wù)器,所以還是要去加一些網(wǎng)關(guān)方面的操作。在這個(gè)配置完成之后,可以看到這個(gè)最大的這張圖,實(shí)現(xiàn)了數(shù)據(jù)的可視化。
接下來(lái)我們簡(jiǎn)單看一些成果展示。首先,最大的成果就是我們實(shí)現(xiàn)了從原始數(shù)據(jù),也就是從最開始的RCU、OBU的數(shù)據(jù)到最后呈現(xiàn)到用戶手里的Superset,我們可以用可視化的方法實(shí)際看到或者探索數(shù)據(jù)。下面是服務(wù)器的部署,為了平和三臺(tái)服務(wù)器上的工作,讓負(fù)載相對(duì)均衡一點(diǎn),我們把三臺(tái)服務(wù)器上安裝的分別的東西都列舉在這兒了。第二個(gè)部分就是我們的創(chuàng)新點(diǎn),能夠處理實(shí)時(shí)流數(shù)據(jù)。從一開始RCU、OBU到EMQX,我們對(duì)于流數(shù)據(jù)的支持進(jìn)行了一定的考慮,一直到最后,整個(gè)過程都是支持完全支持流數(shù)據(jù)處理的。第三就是整個(gè)數(shù)據(jù)和架構(gòu)都具備橫向拓展的空間,我們現(xiàn)在測(cè)試用的原始數(shù)據(jù)是40萬(wàn)條,但是一方面這個(gè)數(shù)據(jù)庫(kù)我們可以拓展,比如說sink到timescaleDB甚至更多的數(shù)據(jù)庫(kù)。最后的可視化也不是只有在Superset,可以在從數(shù)據(jù)庫(kù)中取數(shù)據(jù)到任何其他你想要的地方,包括從前面我們NiFi、Kafka對(duì)于這個(gè)topic的管理都是非常完善的,我們有更多的topic,可以有更多的生產(chǎn)者,消費(fèi)者。最后就是我們?cè)谧龅倪@個(gè)過程中間也把這些軟件程序的應(yīng)用給服務(wù)化了,服務(wù)化的好處就是能夠保證這些服務(wù)都能在后臺(tái)去運(yùn)行。我們借助在這個(gè)特點(diǎn),再借助我們用的圖形界面,我們不需要在登錄服務(wù)器做什么操作了,只需要在本地端在命令行里邊輸入一段命令,就可以直接在本地的localhost中看到每一個(gè)部分的可視化界面,方便我們后續(xù)的操作和測(cè)試。
之后就是Flink的計(jì)算。Flink除了對(duì)消息的轉(zhuǎn)發(fā)之外,也包括計(jì)算能力。我們這里通過一個(gè)簡(jiǎn)單的例子去測(cè)試一下Flink的計(jì)算。這里我們對(duì)于輸入進(jìn)來(lái)的數(shù)據(jù)分類統(tǒng)計(jì)每一個(gè)時(shí)間段的數(shù)量,我們?cè)贔link里添加了一些相應(yīng)的計(jì)算代碼之后,把數(shù)據(jù)也sink到了Times DB的數(shù)據(jù)庫(kù)當(dāng)中。在這個(gè)TimesscaleDB數(shù)據(jù)當(dāng)中,我們就可以看到由Flink計(jì)算得到的數(shù)據(jù)。它在TimesscaleDB中呈現(xiàn)出一個(gè)數(shù)據(jù)積累的效果,那么就驗(yàn)證了在Flink有狀態(tài)計(jì)算的功能。
另外就是Superset的數(shù)據(jù)可視化,我們做了一個(gè)初步的示例dashboard??梢钥闯鰜?lái),右上角的兩個(gè)圖對(duì)于來(lái)源數(shù)據(jù)進(jìn)行分類統(tǒng)計(jì),然后左邊這個(gè)圖是對(duì)于所有車的數(shù)據(jù)——速度進(jìn)行了實(shí)時(shí)的分布統(tǒng)計(jì)圖。右下角是其中一輛車,比如說是它的代號(hào)是mk007,這輛車它的軌跡樣式,以及所有車的所有數(shù)據(jù)點(diǎn)的heat map。這里heat map我們可以看出就是在哪些地方,它明顯是一個(gè)路口。這里數(shù)據(jù)點(diǎn)是比較多的,有可能是因?yàn)檐囋谶@速度比較慢,或者說車在這甚至停掉了。那么在這個(gè)heat map可以看到所有數(shù)據(jù)點(diǎn)的分布情況。
最后簡(jiǎn)單總結(jié)和反思一下,我們?cè)谡麄€(gè)項(xiàng)目過程中間定期的組成例會(huì),每次例會(huì)都留有議題文件以及文件內(nèi)的詳情,每次會(huì)議我們都有企業(yè)導(dǎo)師去參與進(jìn)行指導(dǎo)。最后我們整個(gè)團(tuán)隊(duì)的合作就依照著技術(shù)路線來(lái)展開,一步一步來(lái)做,步步為營(yíng),統(tǒng)籌技術(shù),文字等等去發(fā)揮每一位同學(xué)的長(zhǎng)處優(yōu)勢(shì)。
關(guān)于收獲,整個(gè)過程大家都收獲了很多,更多的是從技術(shù)層面對(duì)于大數(shù)據(jù)相關(guān)的技術(shù)以及一些更具體的技術(shù)都有了更深的了解,當(dāng)然這個(gè)過程中間還有一些存在的問題。最后感謝所有人的努力。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。