JuiceFS 在理想汽车的使用和展望
理想汽车是中国新能源汽车制造商,设计、研发、制造和销售豪华智能电动汽车,于 2015 年 7 月创立,总部位于北京,已投产的自有生产基地位于江苏常州,通过产品创新及技术研发,为家庭用户提供安全及便捷的产品及服务。
在中国,理想汽车是成功实现增程式电动汽车商业化的先锋,首款及目前唯一一款商业化的增程式电动汽车车型理想 ONE 是一款六座中大型豪华电动 SUV(运动型多用途汽车), 配备了增程系统及先进的智能汽车解决方案,于 2019 年 11 月开始量产, 并于 2021 年 5 月 25 日推出 2021 款理想 ONE。截至 2021 年 12 月 31 日,理想汽车已交付达 124,088 辆理想 ONE。
背景
根据国家相关法规和标准,新能源汽车行驶过程中需要将核心组件的信号数据进行收集并上报到政府建设的新能源汽车数据平台中,这些数据的来源有发动机、电池等核心部件。同时监管部门也要求汽车厂商存储这些数据支撑后续的售后维护、OTA 升级,车辆的健康状况检测、早期预警、以及维修保养等。为了更好的服务用户,理想汽车开始自建数据平台。
致力于创造移动的家,成为全球领先的智能电动车企业的理想汽车,其所要管理的数据,规模是非常庞大的。在今天这篇文章中讨论的还仅仅是理想汽车产生的时序信号数据。汽车数据平台的架构中,全量的时序信号数据存储在 HDFS 中,同时也使用 Hadoop 技术栈根据业务需求完成各种复杂的计算和分析任务。
2021 年 12 月,理想汽车交付 14,087 辆理想 ONE,同比 2020 年 12 月增长 130.0%。2021 年 1 月至 12 月,理想 ONE 总计交付 90,491 辆,同比 2020 年增长 177.4%。自交付以来,理想 ONE 累计交付量已达 124,088 辆。可想而知,数据平台管理的车辆数据的增长也是极快的,这对数据平台的敏捷性和弹性都提出了非常高的要求。
玩转大数据的老司机都知道,HDFS 的扩容费时费力,有时甚至难以跟上业务的增长速度。面对业务快速发展和不那么弹性的 HDFS,维护数据平台的工程师们有时只好删除无效、冗余数据,平衡各数据节点的数据,来缓解业务对于敏捷性的高要求和 HDFS 不那么弹性的矛盾。另外,由于 Hadoop 是存储和计算耦合的设计,增加存储空间的同时也需要增加计算,而往往存储和计算的匹配是错位的,不匹配的扩容也会也会带来很多算力冗余,制造不必要的浪费。
业务发展持续向好,也给数据平台带来了甜蜜的烦恼,在 2020 年,数据平台开始着手解决业务变化快和 HDFS 不够弹性的矛盾。当时选型的标尺是:
- 尽量少修改现存的 ETL 流程和计算逻辑,换言之有极好的 HDFS 兼容性
- 弹性极佳
- 透明加速,不能有性能瓶颈
- 稳定性至少要对齐 HDFS
一开始,测试的是云厂商提供的 Hadoop SDK 集成方案,但是由于只实现了有限的 Hadoop API 而且没有缓存,稳定性和性能远远不及 HDFS,这个问题的解决迟迟没有进展。
2021 年初恰逢 JuiceFS 开源,数据平台的同事了解到 JuiceFS 云服务,JuiceFS 在完全兼容 HDFS API 的同时兼具弹性和缓存,初步判断可以解决选型标尺中的前三个问题。我们抱着试一试的心态,第一时间试用了。这里也要感谢 JuiceFS 小伙伴们的大力帮忙,让 JuiceFS 社区版在理想汽车顺利上线,解决了 HDFS 容量紧张的问题,还顺带实现了 Hadoop 存储计算分离的架构升级,最重要的还是满足了业务的敏捷性要求。
JuiceFS 介绍
JuiceFS 是一个面向云环境设计的高性能开源分布式文件系统,完全兼容 POSIX、HDFS、S3 接口,适用于大数据、AI 模型训练、Kubernetes 共享存储、DevOps、海量数据归档等场景。
使用 JuiceFS 存储数据,数据本身会被持久化在对象存储(例如 Amazon S3),而文件系统对应的元数据可以存储在 Redis、MySQL、TiKV 等多种数据库引擎中。同时 JuiceFS 客户端具有缓存能力,为上层应用提供智能 I/O 加速。
应用场景
目前经过半年的使用和迭代,JuiceFS 已经用在理想汽车多个业务场景中。下面分享几个典型的业务场景,希望对 JuiceFS 社区用户有借鉴意义,也欢迎大家提出你们的想法和问题。
JuiceFS 支持核心数仓存储
场景
目前车辆数据分析场景每天新增数据 2TB。数据通过 Spark 直接读写 JuiceFS 进行 ETL 加工。因为 JuiceFS 对 HDFS API 进行了完整兼容,业务上只需要将表路径指定到 JuiceFS 的目录即可。切换上是无感的。
收益
切换到 JuiceFS 后,存储空间一下就从 HDFS 有限的磁盘变成了容量无限的对象存储,同时也实现了 Hadoop 集群的存储计算分离,现在存储使用 JuiceFS 可以弹性伸缩,计算集群也可以根据业务量独立扩缩容。这样,数据平台可以更敏捷的支持业务增长和需求变化。
改进计划
上半年业务上线时,JuiceFS 使用公有云托管的 Redis 存储元数据。因为需要 Redis 的事务 API,无法使用 Redis 集群模式,这样单个 Redis 实例的扩容瓶颈就带来了单个 JuiceFS 文件系统文件数量的限制,暂时没有把所有表都迁移到 JuiceFS。现在 JuiceFS 支持了 TiKV 存储元数据,接下来准备测试并将全部数据迁移到 JuiceFS,空闲出来的本地物理磁盘作为缓存盘。
用 JuiceFS 支持时序数据库 MatrixDB 分级存储
场景
在理想汽车 MaxtrixDB 集群中,即使经过压缩处理,每天仍有将近 500G 的增量数据,这类时序型的数据时效性很强,时间越久需要查看的频次就越低。矛盾的地方在于,即使是历史数据也有低频查询需求,不能对历史数据进行删除;然而 MaxtrixDB 在架构设计上采用本地存储,不能弹性扩缩容。
看了 JuiceFS 在 ClickHouse 上的数据分层实践后,我们推荐给了 MatrixDB 团队,很快 MaxtrixDB 支持了自动分级存储机制,成功实现将温冷数据由本地磁盘自动转移到 JuiceFS,满足查询需求。
收益
在用户使用基本无感知的情况下,降低了近 50% 的存储成本。使用 JuiceFS 实现时序数据库 MatrixDB 的数据分层存储,热数据写入本地 SSD,通过生命周期策略自动转移到 JuiceFS。整个过程仅需简单配置,自动透明,不再需要频繁的手工扩容,还能大幅节省存储成本。空余的 SSD 容量可以做温冷数据的缓存加速,偶尔使用通过缓存加速也能保持很好的性能。
跨平台数据交换
场景
数据平台是 Hadoop 技术栈,算法平台使用 Kubernetes 做资源管理,两个平台在很多业务中都是上下游关系,数据平台负责准备数据,然后给到算法平台完成算法模型的训练。我们解决数据交换的方式是数据平台将数据直接写入到 Hive 表中,Hive 表底层使用 JuiceFS 存储。算法平台启动 Pod 时自动以 POSIX 方式挂载同一个 JuiceFS 文件系统,Pod 中的应用就可以像访问本地目录一样,读取到特征数据了,训练好的结果也同样以 POSIX 方式写入 JuiceFS,数据平台的同学也可以方便的使用算法同学提供的结果。
收益
数据工作流越来越长,越来越复杂,工作任务需要在不同平台、不同团队中协作完成,以前数据总是要在不同存储系统中搬来搬去。拷贝的时间,检查正确性的时间,这些等待和重复的工作非常影响效率,现在 JuiceFS 作为统一数据湖,可以在不同平台、应用中共享各种类型的数据,不用再等待,效率提高很多。
改进计划
目前数据平台使用多租户方式进行数据 ETL 操作。算法平台拉起的 Pod 默认是 root 用户,算法同事回写结果数据到 JuiceFS 后只有 root 用户拥有写权限,而数据平台的 Hive 组件在新增分区时因为没有写权限会导致新增分区失败。最近社区有了一种新的解决方案,是把 Hive 组件的用户加到 Hadoop 的 supergroup 里,这样也就和 root 用户一样拥有了写权限。这个方案我们会在近期新版发布后和算法平台一起测试一下。
平台共享文件
场景
过去整个数据平台使用 HDFS 来共享文件。平台前端应用通过后端服务接口直接将数据上传到 HDFS 上。一方面存在安全隐患,一方面也会出现凌晨任务集中执行时间从 HDFS 下载大文件失败情况,影响任务稳定性。目前已经将实时开发平台的文件共享切换到由 JuiceFS POSIX 方式来提供共享文件的支持。后面计划将所有需要共享文件的平台都收口到 JuiceFS 统一管理。
收益
POSIX 访问方式可以让应用开发更简单,更高效。同时 JuiceFS 也提供了相比 HDFS 峰值时更稳定的吞吐。
展望
经过近一年的使用,我们一直跟进 JuiceFS 社区的迭代,对 JuiceFS 也有了更多的了解,使用遇到的问题可以及时得到社区中的反馈,问题解决也挺快的,感谢社区伙伴的大力支持,我们也一直跟着社区的 release 持续升级(JuiceFS 的升级很简单)。明年的工作规划中,一方面场景会继续扩展和深入,我们计划在公司自动驾驶的大量图片检索场景进行验证和推广。另一方面我们也开始对 JuiceFS 做一些开发,验证后也会和社区讨论反馈到上游代码中。
首先,2022 年的目标是弱化直至去掉 HDFS,后期会使用对象存储作为整个数据湖的底层存储。并希望打通数据湖和数据仓库层面的数据共享。由于对象存储需要网络开销,扩展性好的同时损失了一些效率,JuiceFS 提供了本地缓存来提升性能,理想汽车存储团队目前在着手准备开发增加缓存命中率的功能,例如本地 P2P 读等。
第二,我们整个平台是在多租户环境下运行的,JuiceFS 目前是针对单个文件系统设计,还没有多租户方面的功能。我们也准备开发类似 Apache Ranger 的管理工具,提供用于安全策略的集中管理和对用户访问监控用来管理 JuiceFS 中的数据安全。
第三,目前 JuiceFS 使用 POSIX 挂载时需要直接传递 meta 信息,我们计划将 JuiceFS 社区版进行一定程度的服务化封装,一方面方便用户创建和管理自己的 JuiceFS Volume,集成内部用户认证系统,提升用户体验。另一方面可以隔离集群的部署细节,方便平台团队维护。
第四,数据湖场景计划使用 TiKV 做元数据存储,但是在个别场景中 TiKV 又不如 Redis 来的快一些。所以考虑有些对元数据性能要求高但是数据量可控的场景继续使用 Redis。这样就存在需要维护多套 JuiceFS 的需求。就好像每个 JuiceFS 都是一个目录。用户看到的是一个文件系统一样。类似 Hadoop 的多 NameNode 的 ViewFS。
欢迎关注我们项目 Juicedata/JuiceFS 哟! (0ᴗ0✿)
JuiceFS 在理想汽车的使用和展望的更多相关文章
- 理想汽车 x JuiceFS:从 Hadoop 到云原生的演进与思考
理想汽车在 Hadoop 时代的技术架构 首先简单回顾下大数据技术的发展,基于我个人的理解,将大数据的发展分了4个时期: 第一个时期: 2006 年到 2008 年.2008 年左右,Hadoop 成 ...
- JuiceFS 即将发布 1.0 并调整开源许可
开源一周年 JuiceFS 开始于 2017 年,是一款云原生分布式文件系统,旨在帮助企业解决多云.跨云.混合云环境下所面临的诸多挑战:数据安全和保护.大数据架构升级.海量小文件访问.Kubernet ...
- JuiceFS 在数据湖存储架构上的探索
大家好,我是来自 Juicedata 的高昌健,今天想跟大家分享的主题是<JuiceFS 在数据湖存储架构上的探索>,以下是今天分享的提纲: 首先我会简单的介绍一下大数据存储架构变迁以及它 ...
- 41 位 Contributor 参与,1574 个 PR,不容错过的版本更新!
6 月 25 日,在商业公司 SphereEx 正式成立一月之余的今天,我们很高兴的宣布 Apache ShardingSphere 迎来了 5.0.0-beta 版本的正式发布.经过半年多的优化和打 ...
- SphereEx 获数百万美元天使融资,接力 ShardingSphere 开启 Database Plus 新篇章
5月14日,数据前沿技术领域初创公司 SphereEx 获得来自红杉中国种子基金.初心资本的数百万美元天使轮融资. SphereEx是一家致力于构建新型分布式数据基础设施的公司,秉承开源.共享.生态. ...
- Apache SeaTunnel (Incubating) 2.1.0 发布,内核重构、全面支持 Flink
2021 年 12 月 9 日,SeaTunnel (原名 Waterdrop) 成功加入 Apache 孵化器,进入孵化器后,SeaTunnel 社区花费了大量时间来梳理整个项目的外部依赖以确保整个 ...
- JuiceFS 如何帮助趣头条超大规模 HDFS 降负载
作者简介 王振华,趣头条大数据总监,趣头条大数据负责人. 王海胜,趣头条大数据工程师,10 年互联网工作经验,曾在 eBay.唯品会等公司从事大数据开发相关工作,有丰富的大数据落地经验. 高昌健,Ju ...
- 真实世界里的钢铁侠-特斯拉汽车创始人埃隆·马斯克(Elon Musk)
真实世界里的钢铁侠--特斯拉汽车公司和SpaceX公司总裁马斯克(31岁).当我们得意于「站在山上踢几块石头下去」或是「站在风口上的猪」的成功理论的时候,我们真的成功了吗?我们到底创造了什么?改变了什 ...
- VR虚拟现实技术在教育领域的前景展望
VR虚拟现实技术在教育领域的前景展望 VR虚拟现实技术能迅速火起来,是基于它突破了人们对三维空间在时间与地域上的感知限制,以及市场需求愿景的升级.此技术可广泛地应用到城市规划.室内设计.工业仿真.古迹 ...
随机推荐
- java 编程基础 反射方式获取泛型的类型Fileld.getGenericType() 或Method.getGenericParameterTypes(); (ParameterizedType) ;getActualTypeArguments()
引言 自从JDK5以后,Java Class类增加了泛型功能,从而允许使用泛型来限制Class类,例如,String.class的类型实际上是 Class 如果 Class 对应的类暂时未知,则使 C ...
- python3 迭代器&生成器
前戏:列表生成式 等于 用列表生成式生成列表.需要将所有数据生成到内存中,占用空间,如果数据太多.生成数据就会耗时较久. 例如需要运行卡顿一下..... 定义一个生成器:定义时不生成任何数据,只有通过 ...
- Python 代码设计模式
责任链模式 (场景:OA系统,项目审批...) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 ...
- Various methods for capturing the screen
Explains techniques for capturing the screen programmatically. Download GDI source code - 72.1 Kb Do ...
- 如何用uniapp+vue开发自定义相机插件——拍照+录像功能
调用手机的相机功能并实现拍照和录像是很多APP与插件都必不可少的一个功能,今天智密科技就来分享一下如何基于uniapp + vue实现自定义相机界面,并且实现: 1: 自定义拍照 2: 自定义录像 3 ...
- Android中Log信息的输出方法
第一步:在对应的mk文件中加入:LOCAL_LDLIBS:= -llog第二步:在要使用LOG的cpp文件中加入:#include <android/log.h>#define LOGD( ...
- 再谈多线程模型之生产者消费者(多生产者和单一消费者 )(c++11实现)
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...
- 【LeetCode】137. Single Number II 解题报告(Python)
[LeetCode]137. Single Number II 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/single- ...
- MLP-Mixer: An all-MLP Architecture for Vision
目录 概 主要内容 代码 Tolstlkhin I., Houlsby N., Kolesnikov A., Beyer L., Zhai X., Unterthiner T., Yung J., S ...
- matplotlib 高阶之path tutorial
目录 Bezier example 用path来画柱状图 随便玩玩 import matplotlib.pyplot as plt from matplotlib.path import Path i ...