干货 | 智能网联汽车大数据基础平台构建研究

news2024/9/20 8:48:56

a8ddc949321e0552561c120c0bfd142d.png

以下内容整理自大数据能力提升项目必修课《大数据系统基础》同学们的期末答辩汇报。

eed4bd06c8cecbf915b808fe832b3167.png

各位老师大家上午好,我们组的题目是智能网联汽车大数据基础平台的构建。我们的指导企业是西部智联。我们的汇报将从这五个方面进行展开,第一个方面是项目背景与需求分析。

cb1db3c9d337a96e5ea19bff33231013.png

智能网联汽车是推进智慧交通发展,实现智慧城市建设的重要一环,也是国际公认的未来发展方向,也是我们中国能够实现汽车工业转型、形成国际竞争力的一个重要机遇。因此,重庆市政府西部科学城、重庆高新区管委会和我们学校的李克强教授团队共同策划成立了智能网联汽车领域的研发机构——西部科学城智能网联汽车创新中心。西部智联也是广泛开展业务,推进产业协同发展,促进智能网联汽车产业的规模化落地。

e78bebc06954fcd9f60bfac2818430c5.png

智能网联汽车云控平台的用户主要是普通车主、政府以及企业用户三个部分。普通车主的需求主要是解决应用协同的问题,保证体验感。对于政府的话,主要是要统筹整个交通的管理与控制,对于企业用户的话是利用数据赋能推进产业研发的瓶颈。因此我们就需要不断建立健全车端云、边缘云、区域云、全国云四级的支撑体系。

b7b8525813b91707b025d45282db96ba.png

对于市场前景的话,智能交通市场未来的发展也在持续增长,整个市场规模也是非常巨大的,车路云一体化是实现整个智慧交通商业化落地的一个最可行的方案。因此我国也正在大力推动智能网联汽车示范区的建设。提出到2025年,智能网联汽车将会覆盖全国的所有城市。

0d6fe0ba2de996ce5b6190d17e9060d8.png

小米还有集度汽车也采用Flink和Kafka进行了一些数据集成的实践,我们也建立了北京亦庄自动驾驶示范区以及国家智能网联汽车长沙测试区,实现了智慧公交、自动驾驶出租车等应用。

bfd9cbc306f0948539070ec0ca54686e.png

接下来我来介绍一下整个系统的设计架构。首先,在数据传输阶段,我们采用了MQTT协议进行消息的发布,还有订阅提供一对多的消息发布。在数据处理分发的方面,我们首先采用了Apache Nifi用于可视化的实时整理数据流动,整合数据的总线,接着运用了Kafka对数据进行分发,分发给不同的消费者。在数据分析方面,我们采用了Apache Flink进行有状态的计算,接着把数据分析后的数据传入一个TimescaleDB里面。TimescaleDB是基于postgreSQL数据库打造的一个时序数据库。数据可以自动按照时间和空间进行一个分区。在数据应用方面,我们运用了Apache的Superset进行可视化,因为它可以支持多种的数据库,包括连接我们之前用到的TimescaleDB数据库。

5facd55c908358f9fac2145dcaf70571.png

我们整体的系统的架构如上图所示。除了上述讲到的一些技术以外,在第一部分的数据接入,我们采用的数据是企业提供的一个RCU路端数据,还有一个OBU的云车端的数据,然后采用了TCP协议进行通信,然后运用EMQX的引擎进行数据的接入。基于这个系统框架,我们进行后续的开发实践。

1ec3d24807fde5d48921b01e7cdd8a9b.png

下面我来介绍一下技术实现的部分。首先是我们开发工作的基础,我们开发工作是基于三台华为云的Linux机器,这里非常感谢企业导师的支持。然后初始机的环境的配置、开发用的数据主要是导师提供的静态数据,一共是40万条,还有数据源的模拟程序,所以最终的动态数据的量级可以达到千万的量级。导师也提供了一个数据交互规范,供我们进行参考。

6e5cb2615685446ce89328e3da4539a5.png

数据源程序是使用GO语言进行开发的,我们是使用的MQTT的TCP协议进行传输,模拟实际的数据。单个程序的数据源是10赫兹,我们发送的是一个序列化的Json数据,但这个程序可以启动多个进程,可以模拟多车多路侧单元。我们设计的QoS是0,最多分发一次,这样网络负载比较低,虽然数据有可能会丢失,但是对我们整个实验没有什么太大的影响,下面是一个这个数据的示例。

968c92d4a7de67f3187fca25fd48b27d.png

然后是EMQX的部署,这个部署就比较简单。需要说明的是EMQX安装在服务器上,所以需要考虑到网络安全的问题,所以我们最终还是没有对公网进行开放,我们把端口转发到本地进行调试。右上角就是我们安装完之后的dashboard,我们可以在里面很轻松地看到每秒传入和传出的信息量。

接下来是NiFi和Kafka两个部分,Kafka需要特别注意一下,因为我们后续是在不同的机器上进行流式计算,所以我们需要在局域网内其他机器去访问Kafka,所以我们还需要修改一下相关的监听地址。然后就是NiFi的配置,这个配置主要是两个方面,一个是连接EMQX,是一个MQTT的消费者,然后是连接Kafka,它是一个Kafka brokers,是一个生产者。我们通过同样的方式订阅了OBU所有的信息,把数据直接传输到Kafka中。

8786ab0ce3ee513ac6fcbc0b31f2a913.png

关于Flink的部署,我们在服务器端主要也是考虑到负载平衡和数据吞吐的一些原因,把之前网络密集型的放在了服务器一上,现在这个计算密集型的我们就安装在了服务器二。导师推荐的java环境是JDK1.8,所以我们就用了之前的Flink 1.14.6版本。在本地也需要同样配置一个java开发环境,maven的一个仓库,添加一个相关的价包,然后就可以用这个Flink的流处理模板去进行开发了。右下角是我们做的Kafka source示例,主要是添加一下相关的地址信息和订阅的主题,就可以获得相关的一些offset,配置一下反序列化的方法就可以了。

92b9000705f7fb3eafaa9d41d26fa1d2.png

之后是TimescaleDB的连接,主要是我们需要设计一个存储表,我们是用的JDBC Sink,然后把Flink的计算结果直接存到TimescaleDB中。后面我们验证了一下这个数据库连接是否成功,我们在postgres admin中直接查看数据的结果,可以看到它已经成功存入到数据中了。

472cd1c9fe8559b5becfe93b4906d82f.png

然后是Superset和它的连接,我们是用的这种容器化的部署方式,就是用docker去部署,但是这个其实有一些问题,因为容易出现网络访问的问题,它需要访问速手机局域网内的一个其他的服务器,所以还是要去加一些网关方面的操作。在这个配置完成之后,可以看到这个最大的这张图,实现了数据的可视化。

955d11f0537f2da51aaa8dd24d731ced.png

接下来我们简单看一些成果展示。首先,最大的成果就是我们实现了从原始数据,也就是从最开始的RCU、OBU的数据到最后呈现到用户手里的Superset,我们可以用可视化的方法实际看到或者探索数据。下面是服务器的部署,为了平和三台服务器上的工作,让负载相对均衡一点,我们把三台服务器上安装的分别的东西都列举在这儿了。第二个部分就是我们的创新点,能够处理实时流数据。从一开始RCU、OBU到EMQX,我们对于流数据的支持进行了一定的考虑,一直到最后,整个过程都是支持完全支持流数据处理的。第三就是整个数据和架构都具备横向拓展的空间,我们现在测试用的原始数据是40万条,但是一方面这个数据库我们可以拓展,比如说sink到timescaleDB甚至更多的数据库。最后的可视化也不是只有在Superset,可以在从数据库中取数据到任何其他你想要的地方,包括从前面我们NiFi、Kafka对于这个topic的管理都是非常完善的,我们有更多的topic,可以有更多的生产者,消费者。最后就是我们在做的这个过程中间也把这些软件程序的应用给服务化了,服务化的好处就是能够保证这些服务都能在后台去运行。我们借助在这个特点,再借助我们用的图形界面,我们不需要在登录服务器做什么操作了,只需要在本地端在命令行里边输入一段命令,就可以直接在本地的localhost中看到每一个部分的可视化界面,方便我们后续的操作和测试。

c36804f3c3da0ea83cfbaf4fbff3ba78.png

之后就是Flink的计算。Flink除了对消息的转发之外,也包括计算能力。我们这里通过一个简单的例子去测试一下Flink的计算。这里我们对于输入进来的数据分类统计每一个时间段的数量,我们在Flink里添加了一些相应的计算代码之后,把数据也sink到了Times DB的数据库当中。在这个TimesscaleDB数据当中,我们就可以看到由Flink计算得到的数据。它在TimesscaleDB中呈现出一个数据积累的效果,那么就验证了在Flink有状态计算的功能。

21ed9f8a75d1fb527f33e5b6915649fb.png

另外就是Superset的数据可视化,我们做了一个初步的示例dashboard。可以看出来,右上角的两个图对于来源数据进行分类统计,然后左边这个图是对于所有车的数据——速度进行了实时的分布统计图。右下角是其中一辆车,比如说是它的代号是mk007,这辆车它的轨迹样式,以及所有车的所有数据点的heat map。这里heat map我们可以看出就是在哪些地方,它明显是一个路口。这里数据点是比较多的,有可能是因为车在这速度比较慢,或者说车在这甚至停掉了。那么在这个heat map可以看到所有数据点的分布情况。

最后简单总结和反思一下,我们在整个项目过程中间定期的组成例会,每次例会都留有议题文件以及文件内的详情,每次会议我们都有企业导师去参与进行指导。最后我们整个团队的合作就依照着技术路线来展开,一步一步来做,步步为营,统筹技术,文字等等去发挥每一位同学的长处优势。

关于收获,整个过程大家都收获了很多,更多的是从技术层面对于大数据相关的技术以及一些更具体的技术都有了更深的了解,当然这个过程中间还有一些存在的问题。最后感谢所有人的努力。

编辑:文婧

校对:林亦霖

c91677fc8a78b7ff93012e52d6517710.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/736782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app基础知识

发展 DCloud于2012年开始研发小程序技术,优化webview的功能和性能,并加入W3C和HTML5中国产业联盟。 2015年,DCloud正式商用了自己的小程序,产品名为“流应用”,它不是B/S模式的轻应用,而是能接近原生功能…

Debezium系列之:基于debezium将mysql数据库数据更改流式传输到 Elasticsearch和PostgreSQL数据库

Debezium系列之:基于debezium将mysql数据库数据更改流式传输到 Elasticsearch和PostgreSQL数据库 一、背景二、技术路线三、配置四、从mysql同步数据到Elasticsearch和PostgreSQL数据库五、总结 一、背景 基于 Debezium 的端到端数据流用例,将数据流式传…

I/O 多路复用小结

Socket 模型 Socket 编程是一种使用 Socket 模型进行网络通信的编程技术。它是一种基于网络套接字的编程模型,用于实现不同计算机之间的数据传输。 事实上,在进行网络通信前,通信双方都要创建一个 Socket,双方的数据读写都要依赖于…

【Python】执行SQL报错

可以再数据库查询界面执行的SQL,一直报错 unsupported format character Y (0x59) at index 61 SQL如下: datapd.read_sql_query(sql"""selectdate_format(create_time,%Y-%m) as mon,count(distinct order_id) as ord_cntfrom prod.o…

HTTP与HTTPS

HTTP与HTTPS介绍 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息&…

qt源码--事件系统

qt的事件传播主要依赖于QCoreApplication、QAbstractEventDispatcher(会根据不同的平台生成各自的处理对象)、QEvent(各种事件类型)等。 首先看下QCoreApplication的实现: 2、了解QCoreApplication的构造函数 其构造函…

在最新ICP备案域名的基础上,结合其他网络营销手段,打造强大的品牌推广效果

API接口是一种软件系统之间进行交互的方式,通过API接口,可以在不同的系统之间传递数据、命令等信息。在网络营销中,API接口可以帮助我们更加高效地进行品牌推广。本文将以在最新ICP备案域名的基础上,结合其他网络营销手段&#xf…

JVM回收算法(标记-清除算法, 复制算法, 标记-整理算法)

1.标记-清除算法 最基础的算法,分为两个阶段,“标记”和“清除” 原理: - 标记阶段:collector从mutator根对象开始进行遍历,对从mutator根对象可以访问到的对象都打上一个标识,一般是在对象的header中&am…

vue-router 4.0 动态路由会跳转到 404 页面的问题

引子 开发过前端单页面应用的小伙伴们,应该对前端路由都不陌生吧。 无论是用 vue 或者 react,都有官方提供的 router 方案。 但是有些场景下,处于安全性和友好性考虑,我们需要用到动态路由。 如果你不知道什么叫动态路由&…

翻遍整个牛客网,整理出了全网最全的Java面试八股文大合集,整整4000多页

大家从 Boss 直聘上或者其他招聘网站上都可以看到 Java 岗位众多,Java 岗位的招聘薪酬天差地别,人才要求也是五花八门。而很多 Java 工程师求职过程中,也是冷暖自知。很多时候技术有,但是面试的时候就是过不了! 为了帮…

4.7 x64dbg 应用层的钩子扫描

所谓的应用层钩子(Application-level hooks)是一种编程技术,它允许应用程序通过在特定事件发生时执行特定代码来自定义或扩展其行为。这些事件可以是用户交互,系统事件,或者其他应用程序内部的事件。应用层钩子是在应用…

【Zabbix 监控 Windows 系统,Java应用,SNMP】

目录 一、Zabbix 监控 Windows 系统1、下载 Windows 客户端 Zabbix agent 22、安装客户端,配置3、在服务端 Web 页面添加主机,关联模板 二、Zabbix 监控 java 应用1、客户端开启 java jmxremote 远程监控功能1、配置 java jmxremote 远程监控功能2、启动…

【ARM Coresight 系列文章 3.1 - ARM Coresight DP 对 AP 的访问 2】

文章目录 图 1-1 如上图1-1 所示,DAP上可以集成多个MEM-AP,上图是集成了3个MEM-AP,它们可能是AXI-AP, AHB-AP, APB-AP。 那么AP的类型是如何区分的呢? 不同的组件会使用不同MEM-AP接口,如Cortex-A/Coretex-R 系列的c…

ai绘画工具有哪些?这几款好用的ai绘画工具免费分享给你

上周,我去了一家现代艺术画廊,墙上挂满了令人叹为观止的绘画作品。我被其中一幅细腻而充满情感的油画所深深吸引,想要了解背后的创作过程。这时,一位热情的艺术导师走到我身边。她微笑着说:“这幅作品实际上是由ai绘画…

解决“_mkdir无法识别空格目录“问题

在C编程里,有时候需要创建一个文件夹,通常使用库函数_mkdir(const char* dirname)来新建一个文件夹,该库函数每次只能创建一个文件夹,不能级联创建。若要级联创建文件,则请用递归方式或者for循环方式调用_mkdir()。 #…

7月6日华为云盘古气象大模型登上《Nature》杂志:相比传统数值预报快10000倍

7月6日,国际顶级学术期刊《自然》(Nature)杂志正刊发表了华为云盘古大模型研发团队的最新研究成果——《三维神经网络用于精准中期全球天气预报》(《Accurate medium-range global weather forecasting with 3D neural networks》…

CrossKD 原理与代码解析

paper:CrossKD: Cross-Head Knowledge Distillation for Dense Object Detection official implementation: https://github.com/jbwang1997/CrossKD 前言 蒸馏可以分为预测蒸馏prediction mimicking和特征蒸馏feature imitation两种,201…

【LeetCode】HOT 100(26)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

什么是 AOP?对于 Spring IoC 和 AOP 的理解?Spring AOP 和 AspectJ AOP 有什么区别?

什么是 AOP? AOP(Aspect-Oriented Programming),即 面向切面编程, 它与OOP( ObjectOriented Programming, 面向对象编程) 相辅相成,提供了与OOP 不同的抽象软件结构的视角 在 OOP 中, 我们以类(class)作为我们的基本单元 而 A…

Zynq 多个UDP客户端组网启动问题(Auto negotiation error)PS:附UDP客户端初始化代码

最近正在进行一个Zynq项目,根据设计需求,需要将上位机作为UDP服务器,而FPGA则充当UDP客户端。同时,服务器需要能够接收和控制多个UDP客户端。 开发过程中,我是基于lwip UDP Perf Client 官方模版开发的。我遇到了以下几…