长安汽车:基于云器 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 结合,让业务方更自助地应用。

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

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

相关文章

android图标底色问题,debug与release不一致

背景 在android 8(sdk 26)之前的版本,直接使用图片文件作为图标,开发时比较容易控制图标,但是不同的安卓定制版本就不容易统一图标风格了。 在android 8及之后的版本,图标对应的是ic_launcher.xml&#x…

【iOS】KVO

文章目录 前言一、KVO使用1.基本使用2.context使用3.移除KVO通知的必要性4.KVO观察可变数组 二、代码调试探索1.KVO对属性观察2.中间类3.中间类的方法3.dealloc中移除观察者后,isa指向是谁,以及中间类是否会销毁?总结 三、KVO本质GNUStep窥探…

基于51单片机的遥控开关仿真

基于51单片机的遥控开关设计 (仿真+程序+设计报告) 功能介绍 具体功能: 本课题研究的是一款遥控开关,采用51单片机进行发射电路与接收电路的设计,发射电路由单片机最小系统及四个按键构成&am…

经典笔试题:快速排序 计数排序

Problem: 912. 排序数组 思路 👨‍🏫 三叶题解 💖 AC:计数排序 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) class Solution {public int[] sortArray(int[] nums) {int max -50001, min 50001;for (…

【半个月我拿下了软考证】软件设计师高频考点--系统化教学-关系模式

👨‍💻 收录于专栏:软件设计师考点暴击 ⭐🅰️进入狂砍分⭐ ⭐软件设计师高频考点文档, ⭐软件设计师高频考点专栏 ⭐软件设计师高频考点⭐ 🎶(A) 考点1,关系模式 考点: 三个模式相…

【JVM基础篇】类加载器分类介绍

文章目录 类加载器什么是类加载器类加载器的作用是什么应用场景类加载器的分类启动类加载器用户扩展基础jar包 扩展类加载器和应用程序类加载器扩展类加载器通过扩展类加载器去加载用户jar包: 应用程序加载器 Arthas中类加载器相关功能 文章说明 类加载器 什么是类…

[C++核心编程-01]----C++内存四区详细解析

目录 前言 正文 01-内存区域简介 02-全局区 03-栈区 04-堆区 05-new操作符 总结 前言 当程序运行时,操作系统会为程序分配一块内存空间,这块内存空间被划分为不同的区域,每个区域有其独特的作用…

Unity图形图表XChart插件使用

最近做了一款数字孪生项目,其中涉及到了图形图表的应用,网上找了一下,找到了XChart插件,使用起来蛮方便的,不过还有待继续研究,很多细节性的知识点需要进行学习探索。以下是项目中的应用。 官方应用: ![](https://img-blog.csdnimg.cn/direct/ab9de8e84e7b4be4a50ea…

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

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

哈希(构造哈希函数)

哈希 哈希也可以叫散列 画一个哈希表 哈希冲突越多&#xff0c;哈希表效率越低。 闭散列开放定址法: 1.线性探测&#xff0c;依次往后去找下一个空位置。 2.二次探测&#xff0c;按2次方往后找空位置。 #pragma once #include<vector> #include<iostream> #i…

Linux重定向及缓冲区理解

重定向&#xff1a; 在上一期虚拟文件系统中讲到了每个进程在打开后&#xff0c;都会默认打开3个文件&#xff0c;如下&#xff1a; stdin 标准输入&#xff08;键盘&#xff09; 文件描述符&#xff1a;0 stdout 标准输出&#xff08;显示器&#xff09;文件描述符&a…

每日OJ题_贪心算法四⑤_力扣354. 俄罗斯套娃信封问题

目录 力扣354. 俄罗斯套娃信封问题 解析代码1_动态规划&#xff08;超时&#xff09; 解析代码2_重写排序贪心二分 力扣354. 俄罗斯套娃信封问题 354. 俄罗斯套娃信封问题 难度 困难 给你一个二维整数数组 envelopes &#xff0c;其中 envelopes[i] [wi, hi] &#xff0…

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

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

陪玩系统APP小程序H5音视频社交系统陪玩系统源码,陪玩app源码,陪玩源码搭建陪玩社交系统开发(现成,可定制)线下陪玩系统项目开发搭建

线下陪玩系统项目的设计 在需求分析完成后&#xff0c;接下来进行系统设计。系统设计主要包括以下几个部分&#xff1a; 1. 数据库设计&#xff1a;根据需求分析的结果&#xff0c;设计数据库结构&#xff0c;包括用户信息表、服务信息表、订单信息表等。 2. 界面设计&#…

阮怀俊参与五龙乡黄沙村村企联办“强村公司”

为走好海岛县高质量发展共同富裕特色之路&#xff0c;探索村级集体经济发展新路径、扶持新模式、运行新机制&#xff0c;嵊泗县五龙乡黄沙村股份经济合作社与杭州山舍乡建乡村产业发展有限责任公司联办成“强村公司”。 创始人阮怀俊表示&#xff0c;双方就融合乡域发展和文旅产…

MFC桌面应用中窗口的客户区与非客户区的

在MFC&#xff08;Microsoft Foundation Class&#xff09;中&#xff0c;窗口被分为客户区和非客户区。理解这两个概念对于设计和开发Windows应用程序至关重要。 客户区&#xff08;Client Area&#xff09;&#xff1a; 客户区是窗口中用于显示应用程序内容的区域。它是窗口…

PXE高效批量装机

一、PXE的概述 PXE是由Inter 公司开发的网络引导技术&#xff0c;工作在Client / Server 模式。允许客户机通过网络从远程服务器下载引导镜像&#xff0c;并加载安装文件或者整个操作系统。 1.1PXE优点 规模化&#xff1a;同时装配多台服务器 自动化&#xff1a;安装系统&am…

力扣10.正则表达式匹配

前言&#xff1a; 由于今天面试前端&#xff0c;面试官问对正则表达式的匹配理解吗&#xff1f; 当时脑袋发热&#xff0c;我说就是对字符串的替换。。。。 太抽象了&#xff0c;于是我面试结束后马上打开力扣&#xff0c;解了正则表达式的匹配算法题(四种语言)&#xff1b; 下…

03c++重载运算符

1、深入理解new和delete原理 #include<iostream> using namespace std;/* new 和 delete 1、malloc和new的区别 new 内存开辟构造函数 2、free和 delete的区别 delete 内存回收析构函数 开辟失败malloc返nullptr ,new抛出bad_alloc异常new->operator new delete -&…

回归预测 | Matlab实现GA-LSSVM遗传算法优化最小二乘支持向量机多输入单输出回归预测

回归预测 | Matlab实现GA-LSSVM遗传算法优化最小二乘支持向量机多输入单输出回归预测 目录 回归预测 | Matlab实现GA-LSSVM遗传算法优化最小二乘支持向量机多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现GA-LSSVM遗传算法优化最小…