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

桔妹导读:滴滴自成立以来,有海量的数据存储在离线平台,离线数据虽然存储便宜,压缩比高,但不适用于线上使用。为此,我们提供了一键式DTS平台——FastLoad,帮助业务往在线存储系统搬运离线数据,目前主要针对滴滴自研分布式存储Fusion,Fusion以RocksDB为存储引擎,服务线上集群500+,承载业务数据1600TB+,总QPS峰值1200W+,是一个成熟稳定的分布式NoSQL/NewSQL解决方案。

0.

目录

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

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

  • Ingest SST
  • Map/Reduce产出全局有序文件

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

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

  • 基于FastLoad的数据传输给业务带来的收益
  • 发展规划

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的存储经验
Image placeholder
盖聂
未设置
  51人点赞

没有讨论,发表一下自己的看法吧

推荐文章
亿级海量数据的实时读写和复杂查询实践

摘要:本文分享了每日亿级增量数据的实时读写、复杂查询场景实践介绍,涉及MySQL分表分库策略、数据异构、TiDB使用和优化、微服务架构等内容。  作者:黄哲铿  黄哲铿,中通商业CTO,前1号店技术总

海量数据AtlasDB:把“数据库好用”这件事做到极致

导语:坚守初心、不辱使命,近期海量数据研发的企业级数据库AtlasDB获得了市场的普遍关注。这款以“好用”著称的国产数据库产品,不仅承载着海量数据公司对技术创新的坚持和投入,更凝结着一群拥有“工匠之心

海量数据时代,金融行业数据库实践难题如何解决?

随着数字经济时代的到来,大数据、人工智能技术得到了快速发展与应用,可以说,各行各业都已全情投入到这一波数字化转型浪潮中,把握新的发展机遇,获取数字红利。其中,金融行业可以说是走在转型之路最前沿的行业之

核心业务“瘦身”进行时!手把手带你搭建海量数据实时处理架构

01背景 在线交易服务平台目的是减轻核心系统计算压力和核心性能负荷压力,通过该平台可以将核心系统的交易数据实时捕获、实时计算加工、计算结果保存于SequoiaDB中。并能实时的为用户提供在线交易查询服

面试高频:如何访问 Redis 中的海量数据?

目录前言事故产生分析原因解决方案总结前言有时候我们需要知道线上的redis的使用情况,尤其需要知道一些前缀的key值,那我们怎么去查看呢事故产生因为我们的用户token缓存是采用了【user_toke

海量数据时代,磁带存储的“涅槃重生”

   磁带作为大规模非结构化数据的战略性/低成本存储手段,已然经历了一次复兴。由于磁带在快速恢复网站和反勒索软件方面具有较高的价值,所以备份仍然是它的一个主要用例。不过,磁带的未来增长机会更在于一些新

PB级数据实时查询,滴滴Elasticsearch多集群架构实践

Elasticsearch是基于Lucene实现的分布式搜索引擎,提供了海量数据实时检索和分析能力。Elastic 公司开源的一系列产品组成的ElasticStack,可以为日志服务、搜索引擎、系统监

让AI无处不在:滴滴与蚂蚁金服开源共建SQLFlow

2018年1月,Oracle的官方博客上发表了一篇文章,标题是“It’sPervasive:AIIsEverywhere”。作为全球最著名的商业数据库系统提供商,Oracle在这篇文章里历数了AI在企

localForage——轻松实现 Web 离线存储

课程推荐:web全栈开发就业班--拿到offer再缴学费--融职教育 localStorage能够让你实现基本的数据存储,但它的速度慢,而且不能处理二进制数据。IndexedDB和WebSQL是异步的

滴滴大数据在汽车金融风控场景中的应用

桔妹导读:滴滴独有的出行场景大数据在金融领域有着非常广泛的应用前景,未来可与银行,保险,支付和理财等机构深入合作,帮助传统金融机构提升资源配置效率,降低获客和风险管理成本。出行场景大数据在交易欺诈识别

如何优雅的在react-hook中进行网络请求

推荐课程:前端开发工程师--学习猿地精品课程 前言Hook是在React16.8.0版本中新加入的特性,同时在React-Native的0.59.0版本及以上进行了支持,使用hook可以不用class

【数据结构】2_数据的艺术

程序设计的挑战 利用计算机解决现实生活中的问题 生活中的不同个体之间存在联系 用计算机程序描述生活中个体间的联系 问题:如何描述生活中的个体?数据的概念程序的操作对象,用于描述客观事物数据的特点 可以

滴滴 曾奇:谈谈我所认识的分布式锁

桔妹导读:随着计算机技术和工程架构的发展,微服务变得越来越热。如今,绝大多数服务都处于分布式环境中,其中,数据一致性是我们一直关注的重点。分布式锁到底是什么?经过了哪些发展演进?工程上有哪些实现方案?

滴滴从KV存储到NewSQL实战

桔妹导读:本文讲诉滴滴在分布式Nosql存储Fusion之上构建NewSQL的实践之路。详细描述Fusion-NewSQL的特性,应用场景,设计方案。1.背景Fusion-NewSQL是由滴滴自研的在

滴滴 NewSQL 演进之 Fusion 实践

本文根据滴滴数据库存储专家余汶龙,在DTCC中国第十届数据库大会的演讲整理而成。余汶龙滴滴出行技术专家,曾经在VMware、淘宝、阿里云从事虚拟网络及存储领域的工作。现负责滴滴自研的NoSQL存储、N

浅谈滴滴派单算法

桔妹导读:说到滴滴的派单算法,大家可能感觉到既神秘又好奇,从出租车扬召到司机在滴滴平台抢单最后到平台派单,大家今天的出行体验已经发生了翻天覆地的变化,面对着每天数千万的呼叫,滴滴的派单算法一直在持

HDFS3.2升级在滴滴的实践

桔妹导读:Hadoop 3的第一个稳定版本在2017年底就已经发布了,有了很多重大的改进。在HDFS方面,支持了ErasureCoding、Morethan2NameNodes、Router-Base

Linux 离线安装 php

推荐课程:PHP开发工程师--学习猿地--送9个上线商业项目 准备工作:(需要先下载好两个东西libxml2和php) libxml2:http://ftp.gnome.org/pub/GNOME/s

走进数据的历史

作者:陈启焕,某互联网数据分析师01数据、信息、知识数据是当今的热词。很多人的理解中,数据就是数字,其实不然,数据的范畴要大得多,包括数字、语言、文字、图像、视频,甚至是人类活动的行为都可以被认为是数

搞个大事情,阿里如何实现上亿级数据的精准计数?

背景关系型数据库在执行计数任务时,其执行效率会随着数据量级的增长而降低;当数据量达到亿级别时,计数任务的执行效率已经低到令人不忍直视。在闲鱼团队的关系系统中,我们采用了这样一种方式来实现亿级别数据的毫

Java并发编程,深入理解ReentrantLock

ReentrantLock简介ReentrantLock重入锁, 是实现Lock接口的一个类 ,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次

学习猿地开启IT在线课的精品模式

程序员的工作已经连续十年被国家评为“性价比”最高的职业,而这种技术岗位是需要有一定的技术功底才能从事的工作,需要长时间的、有目的学习积累,并且需要不断磨练,才可以胜任的工作。现在企业招聘程序员的要求越

大神程序员,夜夜coding到天明?Python之父昼伏夜出,PHP创始人24小时都在线

栗子鱼羊 发自凹非寺转自量子位 |公众号QbitAI大神程序员,夜夜coding到天明?有位名叫IvanBessarabov(简称“伊万”)的好事者,刚刚统计了各路大佬的代码提交(gitcommit)

分享一个可视化开发vue框架下的各类ui的web在线表单设计布局器

新手发帖,第一次不小心刷新了一下就没了本人刚入门vue,偶然间发现这款布局器挺好的,可视化开发element所以分享给大家网站地址:http://lowcode.magicalcoder.c...嵌入

Java 与 Kotlin 系列文章 (一):性能问题

随着对Kotlin越来越深入的了解,我发现市面上关于Kotlin方面,比较深入的资料几乎是0,所以我决定,将Kotlin各个方面的研究作为我的研究生课题,而性能问题往往是程序员最佳关注的内容,所以第