2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

滴滴海量离线数据的在线化 — FastLoad

  • 2019-10-02
  • 本文字数:2545 字

    阅读完需:约 8 分钟

滴滴海量离线数据的在线化 — FastLoad

0. 目录

  1. 业务背景:雄关漫道真如铁

  2. 技术探讨:工欲善其事必先利其器

  3. Ingest SST

  4. Map/Reduce 产出全局有序文件

  5. 系统架构:千磨万击还坚劲

  6. 总结展望:直挂云帆济沧海

  7. 基于 FastLoad 的数据传输给业务带来的收益

  8. 发展规划


FastLoad 致力于离线数据在线化,服务业务 300+,单日运行次数 1000+,在线搬运 30TB+的数据,提供数百亿次高效查询,服务稳定性达到 99.99%。


1. 业务背景:雄关漫道真如铁

在没有 FastLoad 以前,业务一般都会自己维护读离线数据,写在线存储引擎的业务逻辑。比如,滴滴有很多重要的业务有如下的场景:前一天的订单数据会落到离线平台,经过一些特征提取和分析,转换成业务需要使用的数据。在第二天线上高峰期前,需要把这部分数据及时导入线上,才能够不影响业务逻辑。这些业务都需要定时更新在线数据、线上使用最新数据,下面我们对需求进行提取。


定时更新


像特征数据,一般需要小时级别甚至天级别的更新,所以业务需要有快捷的定时更新功能。


快速更新


特征数据还有一个特点,就是数据量特别大,以乘客特征为例,动辄上 TB 级别数据量。这么大的数据量通过 SDK 写入肯定是不行的。刚开始业务方也确实是这么玩的,直接通过 Hadoop 任务调用 Redis SDK,然后一条条的写入 Fusion,一般是每天凌晨开始写数据,等到早高峰 8 点时大量读取。但是这种方法实践下来,经常导致 Fusion 各类超时,在早高峰打车已经来临时还在写凌晨的数据,非常影响稳定性。因此第 3 个需求是必须快速更新。


稳定性


这个是毋容置疑的。


多表隔离


有些业务有很多类特征数据,他们有隔离存储的需求,也有分类更新、分类查找的需求,因此需要多表来支持逻辑到物理的隔离。


下面我们看下用户正常写存储的流程,如图展示了以 RocksDB 为引擎的存储的写入过程。



正常灌库流程


如图可见,从 Hive 写到最终存储的链路比较长,数据要经过几次中转才能最终落盘。我们做一个公式换算,1TB 的数据,以 5w 的 QPS 写入存储,每个请求写 512B,需要大约 12 个小时,也就是半天的时间才能将数据完全写入。要是每天更新的任务,在早高峰之前根本不能取到最新的数据,是不满足业务场景的。


为了满足上述提及的 4 点需求,我们需要转换思维,不能拘泥于传统的数据灌入方式。我们萌生了一个快速导入的想法,如果将文件直接拷贝到存储中,就可以避免上图中的 1/2/3/4,直接对外开放读。

2. 技术探讨:工欲善其事必先利其器

Ingest SST

我们需要以文件方式导入到存储引擎中,借助了 RocksDB 提供的 IngestFile 接口,通过用户预先创建好的 SST 文件,直接加载到硬盘的 LSM 结构中,已达到快速导入的目的。直接构造 SST 文件并导入的方式,绕开了上图正常灌库的流程,避免了写 WAL 日志、写内存、刷盘等操作,同时 RocksDB 的 Ingest 能够尽可能地将数据放在 LSM 结构中最底层的位置,减少 L0 到 Ln 层不断 Compact 带来的写放大。



Ingest SST 文件


Ingest SST 文件流程为:


  • 检查需要导入的 SST 是否合法,包括文件之间 Key 值是否有重叠,文件是否为空,ColumnFamilyID 是否合法等等。

  • 阻塞 DB 实例的写入操作,对可能与 Ingest 文件有重叠的 MemTable 进行刷盘操作。阻止 RocksDB 执行新的 Compact 任务导致 LSM 结构更新。

  • 确定 Ingest 的文件应该在磁盘 LSM 结构中的哪一层,RocksDB 会尽可能地将文件放在 Key 值不重叠的最底层。如上图所示,Key 值范围为[E, F]的 SST 文件将 Ingest 导入到了 L1 层;随后,根据当前存在的快照、LSM 组织形式等设置 SST 文件的元信息。

  • 将之前设置的阻塞标记全部删除。


总的来说,Ingest 导入是 RocksDB 的一个很关键的功能特性,适合用户数据的大批量写入。上述描述了一个将新文件 Ingest 到已存在的 DB 实例中的流程,可以看出是比较重的操作,除了会导致停写停 Compact,还会导致 MemTable 强制刷盘。所以对于每天更新的任务,我们完全可以每天往新的 DB 实例里导文件,这样就能避免很多的阻塞。

Map/Reduce 产出全局有序文件

从上述的 Ingest 文件可以看出,导入文件的堵塞需要付出比较大的代价,堵塞在线写和增大系统 Compact。我们可以通过往新 DB 实例中导文件避免堵塞写,通过保证 SST 全局有序避免系统 Compact。从 Hive 到 SST 这一步,我们依赖了大数据引擎进行 Map/Reduce,将原始数据作为输入,按照用户提交的拼接 Key 的方式,启动 Map/Reduce 任务直接构造最终 DB 需要的 SST 文件。

3. 系统架构:千磨万击还坚劲

经过上面的背景和技术细节,我们最终完成了如下图的系统架构。



一键式 DTS 平台——FastLoad 系统架构


整个系统分为以下几个模块:


  • 控制台服务:对外提供控制台表单和 OpenAPI 方式接入,提供创建任务、Schema 转换规则等服务。

  • 大数据调度模块:依赖 Hadoop 的计算资源,将 Hive 数据导出为我们需要的中间文件,在经过 Map/Reduce 的构建,生成全局有序的 SST 文件。

  • 文件下载模块:根据分布式存储的路由表,将 SST 文件下载到不同的存储节点。

  • 文件导入和 DB 切换:依赖上文提及的 Ingest SST 的方式,将文件一次性导入 DB 实例。为了避免上述提及的堵塞,我们提供往新 DB 实例导数据的选项,这样就可以避免因线上写而导致的堵塞,空数据也可以避免 Compact。假如选择了新 DB 导入的选项,最后还会有一次 DB 新旧实例的切换,相当于一次链接映射。

4. 总结展望:直挂云帆济沧海

基于 FastLoad 的数据传输给业务带来的收益

  • 大大缩短业务导数据耗时,1TB 数据平均导入时间为 1 小时;

  • 线上服务业务 300+,每天运行次数 1000+,每天导数据量 30TB+;

  • 服务稳定性达到 99.99%,上线运行 2 年无任何重大事故;

  • 高频运维操作一键自助完成,90% 的问题,5 分钟完成定位;

发展规划

  • 架构优化,整体架构目前依赖 Hadoop,可以考虑迁移到 Spark,提升运行效率;

  • 管控优化,提供更细致更全面的 FastLoad 监控和报表;

  • 多产品应用,目前 FastLoad 主要针对 NoSQL 和 NewSQL 两种场景,同比可以应用在 ES、MQ 等场景;

  • 新场景支持,离线数据的实时读取不仅对 OLTP 场景提供了更好的支持,也为接下来大热的 HTAP 场景提供了无限的可能。


作者介绍


赵锐,滴滴高级工程师


从事分布式存储 NoSQL/NewSQL 的相关研发,参与从零开始构建滴滴分布式存储 Fusion,有 PB 级别存储、千万 QPS 的存储经验。


本文转载自公众号滴滴技术(ID:didi_tech)


原文链接


https://mp.weixin.qq.com/s/geS5USJagRNFAk0qYJ40Cg


2019-10-02 08:002854

评论

发布
暂无评论
发现更多内容

李宏伟 安警官的IP地址已经锁定你!IP地址究竟如何定位到莽村附近?

郑州埃文科技

IP地址 IP定位查询

Wallys /industrial wifi6 router/ Ipq6010 /ipq6018/ipq6000 2x2 2.4G & 5G

Cindy-wallys

IPQ6010 ipq6018 IPQ6000

一文读懂Guava EventBus(订阅\发布事件)

京东科技开发者

架构 观察者模式 Guava EventBus 企业号 2 月 PK 榜

Greenfield

股市老人

Apache Doris 1.2.2 Release 版本正式发布

SelectDB

大数据 数据分析 OLAP 分析型数据库 数据库·

政企服务机构如何进行数字化转型?

优秀

数字化转型

GaiaX开源解读 | 表达式作为逻辑动态化的基础,我们是如何设计的

阿里巴巴文娱技术

开源 研发效能 服务端 多端开发

进击中的 Zebec 生态,Web2 与 Web3 世界的连接器

股市老人

DR-AP40X9-A-Qualcomm-IPQ4019/IPQ4029-2.4G&5G

Cindy-wallys

IPQ4019 ipq4029

构建云边端一体的分布式云架构,软硬结合驱动边缘计算创新场景

Baidu AICLOUD

边缘计算 分布式云

性能测试中获取JVM资源信息

FunTester

CNCF社区首个!KubeEdge达到软件供应链SLSA L3等级

华为云开发者联盟

云原生 华为云 企业号 2 月 PK 榜 华为云开发者联盟

0源码基础学习Spring源码系列(二)——Spring如何解决循环依赖

京东科技开发者

spring 源码 初始化 二级缓存 企业号 2 月 PK 榜

rust入坑指南之ownership

京东科技开发者

rust JVM 内存 企业号 2 月 PK 榜 ownership

软件测试/测试开发 | web自动化测试-PageObject 设计模式

测试人

软件测试 自动化测试 测试开发 Web自动化测试

海量并发低延时 RTC-CDN 系统架构设计(上)

网易云信

实时音视频 音视频开发

设计模式第六讲:责任链模式和迭代器模式详解

C++后台开发

设计模式 责任链模式 迭代器模式 后端开发 Linux服务器开发

Bytebase 体验官之勇闯新手村

朱亚光

Seal 0.4 发布:软件供应链安全洞察更上一层楼!

SEAL安全

软件供应链安全 SEAL 企业号 2 月 PK 榜

2022年最新数据库调查报告:超八成DBA月薪过万,你拖后腿了吗?

墨天轮

MySQL 数据库 oracle 工资 dba

如何在现实场景中随心放置AR虚拟对象?

HarmonyOS SDK

HMS Core

为什么大多数团队推行自动化测试最后却不了了之?

Liam

测试 自动化测试 测试自动化

聊一聊 gRPC 中的拦截器

江南一点雨

gRPC

软件测试/测试开发 | web自动化测试-文件上传与弹框处理

测试人

软件测试 自动化测试 测试开发 Web自动化测试 selenium

海泰方圆受邀参加中关村网信联盟会议并斩获三项殊荣

电子信息发烧客

软件测试 | 常用模拟器使用

测吧(北京)科技有限公司

测试

IoT设备数据业务价值洞察实践——实践类

阿里云AIoT

阿里云 物联网 IoT

飞桨助力南京邮电大学智能芯片测试团队斩获“互联网+”大赛全国银奖

飞桨PaddlePaddle

paddle 芯片 大学生 飞桨 国赛

使用 NGINX 在 Kubernetes 中实现多租户和命名空间隔离

NGINX开源社区

nginx NGINX Ingress Controller NGINX Kubernetes Gateway 企业号 2 月 PK 榜

滴滴海量离线数据的在线化 — FastLoad_语言 & 开发_赵锐_InfoQ精选文章