长安汽车:基于云器 Lakehouse 的车联网大数据平台建设

近年来随着智能汽车行业的迅速发展,数据也在呈爆炸式增长。长安大数据平台承接了长安在生产上大部分流量应用及日常生产业务应用。本文将分享长安汽车在车联网场景下大数据平台建设面临的一些挑战和具体落地的实践。

主要内容如下:

1. 背景介绍

2. 长安汽车面对的挑战

3. 改造前的架构和挑战

4. 改造后的架构介绍

5. 改造后的价值与效果

6. 总结及后续计划


01背景介绍“以前人们称汽车为配备电子功能的机械产品,到今天演变为具有机械功能的智能电子产品,这是一个非常大的转变。”—— 长安云器联合项目组 石静猛

转变,源自产业的数字化转型。新能源汽车厂商正在用数字化技术打造差异性的竞争优势,关注点由发动机的制造逐渐趋向于基于数字化技术打造丰富的用户体验。

中国的汽车产业正在高速发展的过程中完成数字化升级,我国汽车产销总量连续15年稳居全局全球第一。在产销快速增长的同时,车企正在通过数字化提升乘用车产品的竞争力。

(图1:汽车产销总量及增长率)

数字化关系到车辆如何更好地应用,如何更好地跟人互动,与人们的生活打通,包括更广为人知的智能化自动驾驶、智能座舱等应用场景,以及不为人所知的汽车设计、生产制造过程,数字化正在重构汽车工业。

02

长安汽车面对的挑战

面对超大规模数据量和业务的飞速发展,长安大数据平台面临的挑战可以总结为三大方面,即成本高、用数难、运维烦。

1.成本高每天有 20+TB 的新增数据,一年就会接近 9PB 的规模。随着新能源车的比例越来越高,并且新能源车的数据要求全生命周期存储,可能要存储十年,整体下来,存储成本是累加的。业务依然在快速增长,第二年数字可能就会翻倍。在这样的数据量下,计算是超大规模的,即使是一个非常简单的场景如一个简单的 query,都可能会因为数据量庞大而计算困难。

2. 用数难

首先,查询分析慢,因为数据量大,查一天的数据都很难,更何况在很多场景中需要查多天的数据,比如取一辆车在几个月里的明细数据进行分析,将会是一个非常大的挑战。另外,实时数据加工比例非常低,因为数据量大,如果以传统方式对全量数据进行实时加工,成本会非常高。因此只能采用Lambda架构,其中除了一套 t+1 的离线链路,还要有一套实时链路处理一些重要数据。这带来的问题是,当业务新增需求时,或者做一个新的数据产品、处理一些新的信号时,需要从头开发整个链路,在实时链路上重新加入这些数据,开发链路会非常复杂,要跨多个组件、多个平台,除了Java,还需要 SQL 等等,开发门槛高,效率低。

3. 运维烦

Lambda 架构下,不同场景用不同的产品,这种多组件的架构非常复杂,运维困难。同时,性能瓶颈难以突破。另外,每年需要对平台链路进行一次优化升级,运维成本持续高涨。还存在存储空间报警,计算资源浪费的情况。03

改造前的架构和挑战

1. 改造前的架构

长安汽车大数据平台改造前的整体架构是典型的 Lambda 架构,分为实时和离线两部分。

  • 实时链路

使用 Flink 对数据进行一些简单的加工,加工后的数据写到 Doris、ClickHouse或StarRocks 等分析型平台上。中间也包括一些HBase的应用。

  • 离线链路

车上的数据实时接入 Kafka,再通过 Flink 实时消费写到 HDFS 的某个文件,写完之后,天级别的定时任务将这个文本文件加载成 Parquet 文件,再建成表,后面做 t+1 的分析处理,这就是整个离线的链路。

2. 挑战

首先,长安汽车面临着高 TPS+大吞吐的挑战,除了每天会有 22TB 以上的增长,实时吞吐的峰值也超过了每秒 500 万条,这一数字非常可观,并且数据量仍在快速增长。其次,很多 JSON 这种半结构化数据,信号列非常多,随着新能源车数据产品应用的场景越来越多,信号列增长非常快。另一方面,Lambda 架构下的实时化比例非常小,不到 10%,主要是离线加工。

04

改造后的架构介绍

针对上述挑战,我们对大数据平台进行了改造,将数据平台升级到一个更简洁高效的架构。如下图所示,整体上从之前的 Lambda 架构升级为了一体化的Kappa架构,并且从 t+1 加工变成了百分百全域数据实时加工。

平台的各种组件变成了一个组件,最终是一份资源、一个引擎,一种开发语言 SQL,支持不同的 workload,包括实时的加工、离线的加工、实时分析、ad-hoc 查询等等。05

改造后的价值与效果

1. 解决成本高问题

(1)存储成本

以某张表一天的数据量为例,将同一份数据(数据条数和内容完全一致)导到两个平台上来进行对比。在旧的平台上,HDFS存储,单副本大约为2.8T,而新平台,COS存储只有831G。等价换算后,每百亿条在旧平台上为373G,而新平台是130G。存储节省了65%。这还只是单副本的对比,如果是两副本,降低的比例就更高了。

实现这一改进的关键措施如下:

在Parquet存储上自研了更多编码优化,对半结构化数据自研map格式存储,压缩率比JSON更高,查询效率也更高,在存储上对数据进行了行级+信号级的二级去重。

车联网信号数据常存在信号跳变的情况,而去重的基本原则就是不丢失任何跳变信息。乘用车进行行级去重之后,存储降低 60% 左右。新能源车, 采用行级+信号级去重,存储降低 38% 左右。在存储降低之后,下游的计算性能也可以得到极大提升,从而节省计算资源。去重前的原始数据可以归档,进一步降低成本。(2)计算成本

计算成本方面,在同样的数据量、同样的加工逻辑、得到同样的结果,并保证结果正确的前提下,从T+1集中时间计算,分摊成近实时增量计算,比如5分钟加工一次,一天共 288 次,将全天的资源累加起来,与之前天级的计算资源相比较,计算口径为CU时=8core*1hr。可以看到,Spark用了14个CU时,而新平台仅用了3.5个CU时。我们将Spark的资源再增加一倍,把系统负载因子乘以50%,之后与新平台对比,仍然会有50% 左右的计算成本降低。说明同样的数据,得到同样的结果,一样的加工逻辑,将离线计算变成实时计算的基础之上,仍可以获得大幅的计算成本降低。

这里需要说明的是,以上对比都是基于真实生产的 ETL 加工任务,这其中用到的核心技术就是增量计算。

2. 解决用数难问题

(1)提升查询性能

先从查询性能上来说,之前查询数据非常慢。这里提取了 8 个子场景,分别代表了不同的业务价值,比如某些签到信号分析的查询、智慧能耗的分析、云云诊断仪、智能诊断等等。还包括一个创新场景,即跨天查询的场景。

从上图中可以看到,平均性能有三倍的提升。规模越大,表现越好。尤其是跨天场景,以前跑不出来,而现在 5 分钟左右就可以跑出来。查询数据量达到每天 700 亿条,其中跨天查询,三天 2000 亿条数据。实现这一提升,归功于查询 plan 的优化,ShareEverything 架构下更高效的读写性能,以及算子优化、向量执行、shuffle 加速等一系列改进。(2)实现低成本下的 100% 数据实时

用数难中第二个问题是实时的比例低,之前业务想开发一个有实时要求的数据产品,整个过程是非常痛苦的。而现在变成了百分百数据实时,之后要做一个数据产品,只要从这个数仓平台上拿数据、拿结果,直接做开发即可,效率大幅提升。要做到百分百数据实时,低成本是关键,虽然用 Flink 也可以但成本高昂难以接受。上图展示了全链路实时加工的流程。其中有一个 IGS:Ingestion Service,是读写分离的一个独立的服务,能够支持结构化/半结构化的数据实时写入,数据会落到业务库中对应的分区表里,然后对数据做去重,基于去重后的数据做加工,每条链路都是实时加工,并通过增量计算技术来实现,因此成本比较低。同时对延迟数据也能进行加工,因为能够识别出延迟数据落在哪个业务分区,增量计算只算那个分区相关的结果即可。整个数仓建成了一个实时的数仓,支撑车企的各项业务应用。这里以一个典型的业务场景为例,即车联网数据质量分析。以前的平台实现困难,因为要接入一天上千亿条数据,对里面的信号进行分析,一条数据里面可能有几十上百个信号,要把信号 explode 出来,等于要面对上千亿条数据再乘以几十倍的一个数据量来进行分析。传统的方式是根本算不出来的,现在变成了近实时的方案,用增量的方案即可实现。

上图是增量计算的示意图。每次处理 Delta 数据,有两种模式,一个是增量计算 MV,另一个是 table stream 的方式。Table stream 方式也支持多分支,可以在一个表上创建多个,然后做 ETL 加工、监控等等,并且不会增加存储成本,因为底层都是 Meta 支持的,只需要做好应用即可。增量计算 MV,指的是可以用全量的语义写逻辑,系统内部自动地以增量的方式计算,而且会自动刷新,不需要配置调度系统自动触发,所以整个开发过程非常简单。(3)提升数据开发及协同效率

在解决用数难的问题方面,还实现了开发和协同效率的提升。比如以前的开发语言有很多种,包括 Java、Python,以及多种 SQL,开发门槛高,业务方使用难。新的平台统一成了一种语言,同时支持实时和离线分析。另外,在 Lambda 架构下,业务逻辑要维护多套代码,基本上所有的厂商都会有面临这样的问题,还可能带来数据不一致的问题。而新的 Kappa 架构下则只需一套代码。并且,以前一个新的开发,需要打通多组件、多链路、多份数据,效率很低。现在一份数据,一个平台,不再需要导入导出。最后,针对元数据割裂的问题,新的架构下统一了元数据,可以很方便地找到结果表的上游是谁,在数据出问题时也可以进行高效地排查。

3. 解决运维烦问题

(1)架构升级,减轻运维负担

针对运维烦的问题,由原来的 10+ 组件,变成了现在的一套 SaaS 化服务,并且是企业化托管的一套服务,无需投入很大精力,即可轻松完成运维工作。(2)具备线性能力,避免每年一次升级

另一个非常关键的问题是平台要具备线性能力,避免每年一次升级。随着业务的增长,处理能力也线性增长,资源成本也以一个可控的方式增长。从上图中可以看出,在新一代数仓中,随着数据量的翻倍,资源成本也只是接近翻倍。

观察真实的生产环境,包括一天中的高峰期、低谷期,可以看到,吞吐与资源的增长基本上也是接近 1:1 的。

ETL 加工上,我们也对实时的数据吞吐和资源消耗进行了对比,基本上也是接近 1: 1 的关系,证明了其线性的能力。06

总结及后续计划

我们最终的期望是希望车联网数据的应用可以像使用自来水一样简单,这样我们可以自由地利用数据做一些车辆上的创新,想用什么数据打开水龙头即可用。为了实现这一目标,还有很多方向的工作需要做,除了已经规划的更多业务场景的接入之外,未来还要与 AI 结合,让业务方更自助地应用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java数组:三种初始化

一.静态初始化 代码演示: //静态初始化:创建 赋值int[] a {1,2,3,4,5,6};System.out.println(a[0]); 二.动态初始化 代码演示: //动态初始化:包含默认初始化int[] b new int[10];b[0] 10;System.out.println(b[0]); //10System.out.println(b[1])…

25计算机考研院校数据分析 | 中南大学

中南大学(Central South University),位于湖南省长沙市,是中华人民共和国教育部直属的全国重点大学 ,中央直管副部级建制,位列国家“双一流”、“985工程”、“211工程”,入选国家“2011计划”牵…

MySQL前缀索引、脏页和干净页、COUNT(*)讨论、表删除内存问题

文章目录 如何加索引如何给身份证号添加索引 SQL语句变慢脏页 (Dirty Pages)干净页 (Clean Pages)为何区分脏页和干净页处理脏页管理策略 flush如何控制 为什么删除表数据后表文件大小不变问题背景核心原因数据存储方式参数影响 解决方案1. 调整innodb_file_per_table设置2. 使…

vs2019 cpp20 规范的线程头文件 <thread> 注释并探讨两个问题

(1)学习线程,与学习其它容器一样,要多读 STL 库的源码。很多知识就显然而然的明白了。也不用死记硬背一些结论。上面上传了一份注释了一下的 源码。主要是补充泛型推导与函数调用链。基于注释后的源码探讨几个知识点。 STL 库的多…

【SpringBoot】 什么是springboot(三)?springboot使用ajax、springboot使用reids

文章目录 SpringBoot第五章第六章1、springboot使用ajax2、springboot使用reids1、单机版**使用步骤**1-5步67-9步RedisTemplate使用RedisTemplate2、集群版开启集群项目配置1234-5第七章1、springboot文件上传使用步骤1-234-52、springboot邮件发送步骤1-23453、springboot拦截…

【智能算法】最优捕食算法(OFA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2017年,GY Zhu受到动物行为生态学理论启发,提出了最优捕食算法(Optimal Foraging Algorithm, OFA)。 2.算法原理 2.1算法思想 OFA灵感来源…

网络编程学习笔记1

文章目录 一、socket1、创建socket2、网络通信流程3、accept()函数4、signal()函数5、recv()函数6、connect()函数 二、I/O多路复用1.select模型2.poll模型3.epoll模型 注 一、socket 1、创建socket int socket(int domain,int type,int protocol); //返回值:一个…

微信小程序的Vant Weapp组件库(WeUI组件库)

一、定义: 是一套开源的微信小程序UI组件库。提供了一整套UI基础组件和业务组件,能够快速地搭配出一套风格统一的页面 二、使用: (1)(找到.eslintrc.js 右键,在内件终端打开)打开命…

|Python新手小白中级教程|第二十八章:面向对象编程(类定义语法私有属性类的继承与多态)(4)

文章目录 前言一、类定义语法二、私有方法和私有属性1.私有属性2.私有方法 三、类“继承”1.初识继承2.使用super函数调用父类中构造的东西 四、类“多态”1.多态基础2.子类不同形态3.使用isinstance函数与多态结合判断类型 总结 前言 大家好,我是BoBo仔吖&#xf…

RocketMQ学习笔记(一)

一、基本概念 生产者(Producer):也称为消息发布者,是RocketMQ中用来构建并传输消息到服务端的运行实体,举例:发信者主题(Topic):Topic是RocketMQ中消息传输和存储的顶层…

【全开源】Java知识付费教育付费资源付费平台公众号小程序源码

特色功能: 多样化的内容呈现:资源付费平台小程序支持图文、音视频、直播等多种形式的内容呈现,为用户提供了丰富的学习体验。直播课程:专家或讲师可以通过小程序进行在线授课,与用户实时互动,增强了学习的…

再有人说数字孪生大屏没有用,用这8条怼回去。

数字孪生大屏之所以受到欢迎,主要有以下几个原因: 实时数据可视化 数字孪生大屏可以将实时数据以直观的可视化形式展示出来,让用户能够一目了然地了解数据的状态和趋势。这样可以帮助用户更好地理解和分析数据,及时做出决策和调…

动态规划算法练习——计数问题

题目描述 给定两个整数 a 和 b,求 a 和 b 之间的所有数字中 0∼9 的出现次数。 例如,a1024,b1032,则 a 和 b 之间共有 9 个数如下: 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出现 10 次,1 出现…

蓝桥杯-网络安全比赛(7)基础知识 HTTP、TTL、IP数据包、MSS、MTU、ARP、LLMNR、MDNS、NBNS。

1. IP中TTL值能够给我提供什么信息?2. IP头部中标志、13位偏移、32位源IP地址、目标IP、IP数据包格式,有多少字节3. IP头部中的16位标识是什么?4. MSS 和MTU分别有多大?5. 怎么获取路由IP信息?PING、NSLOOKUP、TRACERT…

day6Qt作业

人脸识别系统 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> #include<opencv2/face.hpp> #include <vector> #include <map> #include <QMessag…

创建一个react项目(router,store,axios,antd)最后有项目地址

第一步&#xff1a;使用cra脚手架 创建项目 文档地址&#xff1a;Create React App 中文文档 npx create-react-app 你的项目名称 第二步&#xff1a;整理项目结构和删除多余代码 目标效果图&#xff1a; 在src目录下分别新建apis,assets,components,pages,router,store,ut…

重学JavaScript核心知识点(二)—— 详解Js中的模块化

详解Js中的模块化 1. 模块化的背景2. 来看一个例子3. 优雅的做法 —— 创建模块对象4. 模块与类&#xff08;class&#xff09;5. 合并模块6. 动态加载模块 1. 模块化的背景 JavaScript 在诞生之初是体积很小的&#xff0c;早期&#xff0c;它们大多被用来执行独立的脚本任务&…

C++初学者,使用命令行编绎C文件

今天在家里&#xff0c;闲来无事。又开始学习制作Helloworld! VStudio 版本众多&#xff0c;用哪个好呢&#xff0c;真是不好选择。今天就使用网上的大神&#xff1a;theoractice&#xff0c;制造的版本来学习C&#xff0c;我喜欢2013这个版本&#xff0c;真是太好用了。不但C…

Qt自定义控件--提升为

为什么要自定义控件 1&#xff0c;有复合小控件需要组合为一个整体控件时&#xff1b; 2&#xff0c;一个复合控件需要重复使用时&#xff1b; 实现 自定义控件文件 新增三个文件 关联不同组的控件 关联之前的准备工作 1&#xff0c;在主控件选择和子控件所有控件所在控件…

【一键录音,轻松转换:用Python打造个性化音频记录工具】

在数字化时代,音频记录已成为日常学习、工作和娱乐不可或缺的一部分。想象一下,只需简单按下几个键,即可随时随地捕捉灵感,记录会议要点,或是珍藏孩子的童言稚语。本文将引领您步入Python编程的奇妙世界,展示如何借助几个强大的库,构建一个既简单又实用的音频录制及转换…