toc: true
title: 滴滴实时计算发展之路及平台架构实践
date: 2019-08-25
tags:git
滴滴的核心业务是一个实时在线服务,所以具备丰富的实时数据和实时计算场景。本文将介绍滴滴实时计算发展之路以及平台架构实践。github
<!--more-->sql
随着滴滴业务的发展,滴滴的实时计算架构也在快速演变。到目前为止大概经历了三个阶段:json
下图标识了其中重要的里程碑,稍后会给出详细阐述:segmentfault
在2017年之前,滴滴并无统一的实时计算平台,而是各个业务方自建小集群。其中用到的引擎有Storm、JStorm、Spark Streaming、Samza等。业务方自建小集群模式存在以下弊端:缓存
为了有效解决以上问题,滴滴从2017年年初开始构建统一的实时计算集群及平台。微信
技术选型上,咱们基于滴滴现状选择了内部用大规模数据清洗的Spark Streaming引擎,同时引入On-YARN模式,并利用YARN的多租户体系构建了认证、鉴权、资源隔离、计费等机制。session
相对于离线计算,实时计算任务对于稳定性有着更高的要求,为此咱们构建了两层资源隔离体系:架构
咱们经过改造YARN的FairScheduler使其支持Node Label。达到的效果以下图所示:框架
普通业务的任务混跑在同一个Label机器上,而特殊业务的任务跑在专用Label的机器上。
经过集中式大集群和平台化建设,基本消除了业务方自建小集群带来的弊端,实时计算也进入了第二阶段。
伴随着业务的发展,咱们发现Spark Streaming的Micro Batch模式在一些低延时的报警业务及在线业务上显得捉襟见肘。因而咱们引入了基于Native Streaming模式的Flink做为新一代实时计算引擎。
Flink不只延时能够作到毫秒级,并且提供了基于Process Time/Event Time丰富的窗口函数。基于Flink咱们联合业务方构架了滴滴流量最大的业务网关监控系统,并快速支持了诸如乘客位置变化通知、轨迹异常检测等多个线上业务。
为了最大程度方便业务方开发和管理流计算任务,咱们构建了如图所示的实时计算平台:
在流计算引擎基础上提供了StreamSQL IDE、监控报警、诊断体系、血缘关系、任务管控等能力。各自的做用以下:
在滴滴内部有大量的实时运营场景,好比“某城市乘客冒泡后10秒没有下单”。针对这类检测事件之间依赖关系的场景,用Fink的CEP是很是合适的。
可是社区版本的CEP不支持描述语言,每一个规则须要开发一个应用,同时不支持动态更新规则。为了解决这些问题,滴滴作了大量功能扩展及优化工做。功能扩展方面主要改动有:
除了功能拓展以外,为了应对大规模运营规则的挑战,滴滴在CEP性能上也作了大量优化,主要有:
以上优化将CEP性能提高了多个数量级。配合功能扩展,咱们在滴滴内部提供了如图所示的服务模式:
业务方只须要清洗数据并提供规则列表API便可具有负责规则的实时匹配能力。
目前滴滴CEP已经在快车个性化运营、实时异常工单检测等业务上落地,取得了良好的效果。
正如离线计算中Hive之于MapReduce同样,流式SQL也是必然的发展趋势。经过SQL化能够大幅度下降业务方开发流计算的难度,业务方再也不须要学习Java/Scala,也不须要理解引擎执行细节及各种参数调优。
为此咱们在2018年启动了StreamSQL建设项目,在社区Flink SQL基础上拓展了如下能力:
扩展DDL语法。以下图所示,打通了滴滴内部主流的消息队列以及实时存储系统(StreamSQL内置打通消息队列及实施存储):
目前StreamSQL在滴滴已经成功落地,流计算开发成本获得大幅度下降。预期将来将承担80%的流计算业务量。
做为一家出行领域的互联网公司,滴滴对实时计算有自然的需求。
过去的一年多时间里,咱们从零构建了集中式实时计算平台,改变了业务方自建小集群的局面。为知足低延时业务的需求,成功落地了Flink Streaming,并基于Flink构建了实时规则匹配(CEP)服务以及StreamSQL,使得流计算开发能力大幅度下降。将来将进一步拓展StreamSQL,并在批流统1、IoT、实时机器学习等领域探索和建设。
微信公众号:zhisheng
另外我本身整理了些 Flink 的学习资料,目前已经所有放到微信公众号(zhisheng)了,你能够回复关键字:Flink 便可无条件获取到。另外也能够加我微信 你能够加个人微信:yuanblog_tzs,探讨技术!
更多私密资料请加入知识星球!
https://github.com/zhisheng17/flink-learning/
之后这个项目的全部代码都将放在这个仓库里,包含了本身学习 flink 的一些 demo 和博客
一、Flink 从0到1学习 —— Apache Flink 介绍
二、Flink 从0到1学习 —— Mac 上搭建 Flink 1.6.0 环境并构建运行简单程序入门
三、Flink 从0到1学习 —— Flink 配置文件详解
四、Flink 从0到1学习 —— Data Source 介绍
五、Flink 从0到1学习 —— 如何自定义 Data Source ?
六、Flink 从0到1学习 —— Data Sink 介绍
七、Flink 从0到1学习 —— 如何自定义 Data Sink ?
八、Flink 从0到1学习 —— Flink Data transformation(转换)
九、Flink 从0到1学习 —— 介绍 Flink 中的 Stream Windows
十、Flink 从0到1学习 —— Flink 中的几种 Time 详解
十一、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 ElasticSearch
十二、Flink 从0到1学习 —— Flink 项目如何运行?
1三、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 Kafka
1四、Flink 从0到1学习 —— Flink JobManager 高可用性配置
1五、Flink 从0到1学习 —— Flink parallelism 和 Slot 介绍
1六、Flink 从0到1学习 —— Flink 读取 Kafka 数据批量写入到 MySQL
1七、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 RabbitMQ
1八、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 HBase
1九、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 HDFS
20、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 Redis
2一、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 Cassandra
2二、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 Flume
2三、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 InfluxDB
2四、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 RocketMQ
2五、Flink 从0到1学习 —— 你上传的 jar 包藏到哪里去了
2六、Flink 从0到1学习 —— 你的 Flink job 日志跑到哪里去了
2八、Flink 从0到1学习 —— Flink 中如何管理配置?
2九、Flink 从0到1学习—— Flink 不能够连续 Split(分流)?
30、Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文
3二、为何说流处理即将来?
3三、OPPO 数据中台之基石:基于 Flink SQL 构建实时数据仓库
3六、Apache Flink 结合 Kafka 构建端到端的 Exactly-Once 处理
3八、如何基于Flink+TensorFlow打造实时智能异常检测平台?只看这一篇就够了
40、Flink 全网最全资源(视频、博客、PPT、入门、原理、实战、性能调优、源码解析、问答等持续更新)
4二、Flink 从0到1学习 —— 如何使用 Side Output 来分流?
四、Flink 源码解析 —— standalone session 模式启动流程
五、Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Job Manager 启动
六、Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Task Manager 启动
七、Flink 源码解析 —— 分析 Batch WordCount 程序的执行过程
八、Flink 源码解析 —— 分析 Streaming WordCount 程序的执行过程
九、Flink 源码解析 —— 如何获取 JobGraph?
十、Flink 源码解析 —— 如何获取 StreamGraph?
十一、Flink 源码解析 —— Flink JobManager 有什么做用?
十二、Flink 源码解析 —— Flink TaskManager 有什么做用?
1三、Flink 源码解析 —— JobManager 处理 SubmitJob 的过程
1四、Flink 源码解析 —— TaskManager 处理 SubmitJob 的过程
1五、Flink 源码解析 —— 深度解析 Flink Checkpoint 机制
1六、Flink 源码解析 —— 深度解析 Flink 序列化机制
1七、Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?
1八、Flink Metrics 源码解析 —— Flink-metrics-core
1九、Flink Metrics 源码解析 —— Flink-metrics-datadog
20、Flink Metrics 源码解析 —— Flink-metrics-dropwizard
2一、Flink Metrics 源码解析 —— Flink-metrics-graphite
2二、Flink Metrics 源码解析 —— Flink-metrics-influxdb
2三、Flink Metrics 源码解析 —— Flink-metrics-jmx
2四、Flink Metrics 源码解析 —— Flink-metrics-slf4j
2五、Flink Metrics 源码解析 —— Flink-metrics-statsd
2六、Flink Metrics 源码解析 —— Flink-metrics-prometheus
2七、Flink 源码解析 —— 如何获取 ExecutionGraph ?
30、Flink Clients 源码解析
原文出处:zhisheng的博客,欢迎关注个人公众号:zhisheng