美团点评基于 Flink 的实时数仓平台实践

数据仓库的建设是“数据智能”必不可少的一环,也是大规模数据应用中必然面临的挑战,而 Flink 实时数仓在数据链路中扮演着极为重要的角色。本文中,美团点评高级技术专家鲁昊为大家分享了美团点评基于 Apache Flink 的实时数仓平台实践。

本文授权转自社区公众号,原文地址

目录:

一、美团点评实时计算演进

美团点评实时计算演进历程

在 2016 年,美团点评就已经基于 Storm 实时计算引擎实现了初步的平台化。2017 年初,我们引入了 Spark Streaming 用于特定场景的支持,主要是在数据同步场景方面的尝试。在 2017 年底,美团点评实时计算平台引入了 Flink。相比于 Storm 和 Spark Streaming,Flink 在很多方面都具有优势。这个阶段我们进行了深度的平台化,主要关注点是安全、稳定和易用。从 19 年开始,我们致力于建设包括实时数仓、机器学习等特定场景的解决方案来为业务提供更好的支持。

实时计算平台

目前,美团点评的实时计算平台日活跃作业数量为万级,高峰时作业处理的消息量达到每秒 1.5 亿条,而机器规模也已经达到了几千台,并且有几千位用户正在使用实时计算服务。

实时计算平台架构

如下图所示的是美团点评实时计算平台的架构。

  • 最底层是收集层,这一层负责收集用户的实时数据,包括 Binlog、后端服务日志以及 IoT 数据,经过日志收集团队和 DB 收集团队的处理,数据将会被收集到 Kafka 中。这些数据不只是参与实时计算,也会参与离线计算。

  • 收集层之上是存储层,这一层除了使用 Kafka 做消息通道之外,还会基于 HDFS 做状态数据存储以及基于 HBase 做维度数据的存储。

  • 存储层之上是引擎层,包括 Storm 和 Flink。实时计算平台会在引擎层为用户提供一些框架的封装以及公共包和组件的支持。

  • 在引擎层之上就是平台层了,平台层从数据、任务和资源三个视角去管理。

  • 架构的最上层是应用层,包括了实时数仓、机器学习、数据同步以及事件驱动应用等。

本次分享主要介绍实时数仓方面的建设情况。

从功能角度来看,美团点评的实时计算平台主要包括作业和资源管理两个方面的功能。其中,作业部分包括作业配置、作业发布以及作业状态三个方面的功能。

  • 在作业配置方面,则包括作业设置、运行时设置以及拓扑结构设置;

  • 在作业发布方面,则包括版本管理、编译/发布/回滚等;

  • 作业状态则包括运行时状态、自定义指标和报警以及命令/运行时日志等。

在资源管理方面,则为用户提供了多租户资源隔离以及资源交付和部署的能力。

业务数仓实践

  • 流量

前面提到,现在的美团点评实时计算平台更多地会关注在安全、易用和稳定方面,而应用上很大的一个场景就是业务数仓。接下来会为大家分享几个业务数仓的例子。

第一个例子是流量,流量数仓是流量类业务的基础服务,从业务通道而言,会有不同通道的埋点和不同页面的埋点数据,通过日志收集通道会进行基础明细层的拆分,按照业务维度划分不同的业务通道,如美团通道、外卖通道等。

基于业务通道还会进行一次更加细粒度的拆分,比如曝光日志、猜你喜欢、推荐等。以上这些包括两种使用方式,一种是以流的方式提供下游其他业务方使用,另外一方面就是做一些流量方面的实时分析。

下图中右边是流量数仓的架构图,自下向上分为四层,分别是 SDK 层,包括了前端、小程序以及 APP 的埋点;其上是收集层,埋点日志落地到 Nginx,通过日志收集通道收到 Kafka 中。在计算层,流量团队基于 Storm 能力实现了上层的 SQL 封装,并实现了 SQL 动态更新的特性,在 SQL 变更时不必重启作业。

  • 广告实时效果

这里再举一个基于流量数仓的例子-广告实时效果验证。下图中左侧是广告实时效果的对比图。广告的打点一般分为请求(PV)打点、SPV(Server PV)打点、CPV(Client PV)曝光打点和 CPV 点击打点,在所有打点中都会包含一个流量的 requestID 和命中的实验路径。根据 requestID 和命中的实验路径可以将所有的日志进行 join,得到一个 request 中需要的所有数据,然后将数据存入 Durid 中进行分析,支持实际 CTR、预估 CTR 等效果验证。

  • 即时配送

这里列举的另外一个业务数仓实践的例子是即时配送。实时数据在即时配送的运营策略上发挥了重要作用。以送达时间预估为例,交付时间衡量的是骑手送餐的交付难度,整个履约时间分为了多个时间段,配送数仓会基于 Storm 做特征数据的清洗、提取,供算法团队进行训练并得到时间预估的结果。这个过程涉及到商家、骑手以及用户的多方参与,数据的特征会非常多,数据量也会非常大。

  • 总结

业务实时数仓大致分为三类场景:流量类、业务类和特征类,这三种场景各有不同。

  • 在数据模型上,流量类是扁平化的宽表,业务数仓更多是基于范式的建模,特征数据是 KV 存储。

  • 从数据来源区分,流量数仓的数据来源一般是日志数据;业务数仓的数据来源是业务 binlog 数据;特征数仓的数据来源则多种多样。

  • 从数据量而言,流量和特征数仓都是海量数据,每天百亿级以上,而业务数仓的数据量一般每天百万到千万级。

  • 从数据更新频率而言,流量数据极少更新,则业务和特征数据更新较多。流量数据一般关注时序和趋势,业务数据和特征数据关注状态变更。

  • 在数据准确性上,流量数据要求较低,而业务数据和特征数据要求较高。

  • 在模型调整频率上,业务数据调整频率较高,流量数据和特征数据调整频率较低。

上面为大家介绍了实时数仓的业务场景,接下来为大家介绍实时数仓的演进过程和美团点评的实时数仓平台建设思路。

传统数仓模型

为了更有效地组织和管理数据,数仓建设往往会进行数据分层,一般自下而上分为四层:ODS(操作数据层)、DWD(数据明细层)、DWS(汇总层)和应用层。即时查询主要通过 Presto、Hive 和 Spark 实现。

实时数仓模型

实时数仓的分层方式一般也遵守传统数据仓库模型,也分为了 ODS 操作数据集、DWD 明细层和 DWS 汇总层以及应用层。但实时数仓模型的处理的方式却和传统数仓有所差别,如明细层和汇总层的数据一般会放在 Kafka 上,维度数据一般考虑到性能问题则会放在 HBase 或者 Tair 等 KV 存储上,即席查询则可以使用 Flink 完成。

准实时数仓模型

在以上两种数仓模型之外,我们发现业务方在实践过程中还有一种准实时数仓模型,其特点是不完全基于流去做,而是将明细层数据导入到 OLAP 存储中,基于 OLAP 的计算能力去做汇总并进行进一步的加工。

实时数仓和传统数仓的对比

实时数仓和传统数仓的对比主要可以从四个方面考虑:

  • 第一个是分层方式,离线数仓为了考虑到效率问题,一般会采取空间换时间的方式,层级划分会比较多;则实时数仓考虑到实时性问题,一般分层会比较少,另外也减少了中间流程出错的可能性。

  • 第二个是事实数据存储方面,离线数仓会基于 HDFS,实时数仓则会基于消息队列(如 Kafka)。

  • 第三个是维度数据存储,实时数仓会将数据放在 KV 存储上面。

  • 第四个是数据加工过程,离线数仓一般以 Hive、Spark 等批处理为主,而实时数仓则是基于实时计算引擎如 Storm、Flink 等,以流处理为主。

实时数仓建设方案对比

下图中对于实时数仓的两种建设方式,即准实时数仓和实时数仓两种方式进行了对比。它们的实现方式分别是基于 OLAP 引擎和流计算引擎,实时度则分别是分钟和秒级。

在调度开销方面,准实时数仓是批处理过程,因此仍然需要调度系统支持,虽然调度开销比离线数仓少一些,但是依然存在,而实时数仓却没有调度开销。

在业务灵活性方面,因为准实时数仓基于 OLAP 引擎实现,灵活性优于基于流计算的方式。

在对数据晚到的容忍度方面,因为准实时数仓可以基于一个周期内的数据进行全量计算,因此对于数据晚到的容忍度也是比较高的,而实时数仓使用的是增量计算,对于数据晚到的容忍度更低一些。

在扩展性方面,因为准实时数仓的计算和存储是一体的,因此相比于实时数仓,扩展性更弱一些。

在适用场景方面,准实时数仓主要用于有实时性要求但不太高、数据量不大以及多表关联复杂和业务变更频繁的场景,如交易类型的实时分析,实时数仓则更适用于实时性要求高、数据量大的场景,如实时特征、流量分发以及流量类型实时分析。

总结一下,基于 OLAP 引擎的建设方式是数据量不太大,业务流量不太高情况下为了提高时效性和开发效率的一个折中方案,从未来的发展趋势来看,基于流计算的实时数仓更具有发展前景。

一站式解决方案

从业务实践过程中,我们看到了业务建设实时数仓的共同需求,包括发现不同业务的元数据是割裂的,业务开发也倾向于使用 SQL 方式同时开发离线数仓和实时数仓,需要更多的运维工具支持。因此我们规划了一站式解决方案,希望能够将整个流程贯通。

这里的一站式解决方案主要为用户提供了数据开发工作平台、元数据管理。同时我们考虑到业务从生产到应用过程中的问题,我们 OLAP 生产平台,从建模方式、生产任务管理和资源方面解决 OLAP 生产问题。左侧是我们已经具备数据安全体系、资源体系和数据治理,这些是离线数仓和实时数仓可以共用的。

为何选择 Flink?

实时数仓平台建设之所以选择 Flink 是基于以下四个方面的考虑,这也是实时数仓方面关注的比较核心的问题。

  • 第一个是状态管理,实时数仓里面会进行很多的聚合计算,这些都需要对于状态进行访问和管理,Flink 在这方面比较成熟。

  • 第二个是表义能力,Flink 提供极为丰富的多层次 API,包括 Stream API、Table API 以及 Flink SQL。

  • 第三个是生态完善,实时数仓的用途广泛,用户对于多种存储有访问需求,Flink 对于这方面的支持也比较完善。

最后一点就是 Flink 提供了流批统一的可能性。

实时数仓平台

  • 建设思路

实时数仓平台的建设思路从外到内分为了四个层次,我们认为平台应该做的事情是为用户提供抽象的表达能力,分别是消息表达、数据表达、计算表达以及流和批统一。

  • 实时数仓平台架构

如下图所示的是美团点评的实时数仓平台架构,从下往上看,资源层和存储层复用了实时计算平台的能力,在引擎层则会基于 Flink Streaming 实现一些扩展能力,包括对 UDF 的集成和 Connector 的集成。再往上是基于 Flink SQL 独立出来的 SQL 层,主要负责解析、校验和优化。在这之上是平台层,包括开发工作台、元数据、UDF 平台以及 OLAP 平台。最上层则是平台所支持的实时数仓的应用,包括实时报表、实时 OLAP、实时 Dashboard 和实时特征等。

  • 消息表达-数据接入

在消息表达层面,因为 Binlog、埋点日志、后端日志以及 IoT 数据等的数据格式是不一致的,因此美团点评的实时数仓平台提供数据接入的流程,能够帮助大家把数据同步到 ODS 层。这里主要实现了两件事情,分别是统一消息协议和屏蔽处理细节。

如下图左侧是接入过程的一个例子,对于 Binlog 类型数据,实时数仓平台还为大家提供了分库分表的支持,能够将属于同一个业务的不同的分库分表数据根据业务规则收集到同一个 ODS 表中去。

  • 计算表达-扩展 DDL

美团点评实时数仓平台基于 Flink 扩展了 DDL,这部分工作的主要目的是建设元数据体系,打通内部的主流实时存储,包括 KV 数据、OLAP 数据等。由于开发工作台和元数据体系是打通的,因此很多数据的细节并不需要大家在 DDL 中明确地声明出来,只需要在声明中写上数据的名字,和运行时的一些设置,比如 MQ 从最新消费还是最旧消费或者从某个时间戳消费即可,其他的数据访问方式是一致的。

  • 计算表达-UDF 平台

对于 UDF 平台而言,需要从三个层面考虑:

首先是数据安全性。之前的数仓建设过程中,用户可以上传 Jar 包去直接引用 UDF,这样做是有危险性存在的,并且我们无法知道数据的流向。从数据安全的角度来考虑,平台会进行代码审计和血缘关系分析,对于历史风险组件或者存在问题的组件可以进行组件收敛。

第二个层面,在数据安全基础上我们还会关注 UDF 的运行质量,平台将会为用户提供模板、用例以及测试的管理,为用户屏蔽编译打包、Jar 包管理的过程,并且会在 UDF 模板中进行指标日志的埋点和异常处理。

第三个层面是 UDF 的复用能力,因为一个业务方开发的 UDF,其他业务方很可能也会使用,但是升级过程中可能会带来不兼容的问题,因此,平台为业务提供了项目管理、函数管理和版本管理的能力。

UDF 的应用其实非常广泛,UDF 平台并不是只支持实时数仓,也会同时支持离线数仓、机器学习以及查询服务等应用场景。下图中右侧展示的是 UDF 的使用案例,左图是 UDF 的开发流程,用户只需要关心注册流程,接下来的编译打包、测试以及上传等都由平台完成;右图是 UDF 的使用流程中,用户只需要声明 UDF,平台会进行解析校验、路径获取以及在作业提交的时候进行集成。

  • 实时数仓平台-Web IDE

最后介绍一下实时数仓平台的开发工作台,以 Web IDE 的形式集成了模型、作业以及 UDF 的管理,用户可以在 Web IDE 上以 SQL 方式开发。平台会对 SQL 做一些版本的管理,并且支持用户回退到已部署成功的版本上去。

三、未来发展与思考

资源自动调优

从整个实时计算角度来考虑,目前美团点评的实时计算平台的节点数已经达到了几千台,未来很可能会达到上万台,因此资源优化这件事情很快就会被提上日程。由于业务本身的流量存在高峰和低谷,对于一个实时任务来说,可能在高峰时需要很多资源,但是在低谷时并不需要那么多资源。

另外一方面,波峰本身也是会发生变化的,有可能随着业务的上涨使得原来分配的资源数量不够用。因此,资源自动调优有两个含义,一个是指能够适配作业的高峰流量上涨,自动适配 Max 值;另外一个含义是指使得作业能够在高峰过去之后自动适应流量减少,能够快速缩容。我们可以通过每个任务甚至是算子的历史运行情况,拟合得到算子、流量与资源的关系函数,在流量变化时同步调整资源量。

以上是资源优化的思路,除此之外还需要考虑当资源完成优化之后应该如何利用。为了保证可用性,实时和离线任务一般会分开部署,否则带宽、IO 都可能被离线计算打满导致实时任务延迟。而从资源使用率角度出发,则需要考虑实时和离线的混合部署,或者以流的方式来处理一些实时性要求并不是非常高的任务。这就要求更细粒度的资源隔离和更快的资源释放。

推动实时数仓建设方式升级

实时数仓的建设一般分为几个步骤:

  • 首先,业务提出需求,后续会进行设计建模、业务逻辑开发和底层技术实现。美团点评的实时数仓建设思路是将技术实现统一表达,让业务关注逻辑开发,而逻辑开发也可以基于配置化手段实现自动构建。

  • 再上一层是可以根据业务需求实现智能建模,将设计建模过程实现自动化。

目前,美团点评的实时数仓平台建设工作还集中在统一表达的层次,距离理想状态仍然有比较长的一段路要走。

Flink Forward Asia 2019 PPT 下载链接给你们准备好啦!公众号(zhisheng)里面回复 ffa 即可下载,也可以扫描下面的二维码关注,回复 ffa 即可下载。

微信公众号

Github 代码仓库

https://github.com/zhisheng17/flink-learning/

以后这个项目的所有代码都将放在这个仓库里,包含了自己学习 flink 的一些 demo 和博客。

本文的项目代码在 https://github.com/zhisheng17/flink-learning/tree/master/flink-learning-connectors/flink-learning-connectors-rabbitmq

博客

1、Flink 从0到1学习 —— Apache Flink 介绍

2、Flink 从0到1学习 —— Mac 上搭建 Flink 1.6.0 环境并构建运行简单程序入门

3、Flink 从0到1学习 —— Flink 配置文件详解

4、Flink 从0到1学习 —— Data Source 介绍

5、Flink 从0到1学习 —— 如何自定义 Data Source ?

6、Flink 从0到1学习 —— Data Sink 介绍

7、Flink 从0到1学习 —— 如何自定义 Data Sink ?

8、Flink 从0到1学习 —— Flink Data transformation(转换)

9、Flink 从0到1学习 —— 介绍 Flink 中的 Stream Windows

10、Flink 从0到1学习 —— Flink 中的几种 Time 详解

11、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 ElasticSearch

12、Flink 从0到1学习 —— Flink 项目如何运行?

13、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 Kafka

14、Flink 从0到1学习 —— Flink JobManager 高可用性配置

15、Flink 从0到1学习 —— Flink parallelism 和 Slot 介绍

16、Flink 从0到1学习 —— Flink 读取 Kafka 数据批量写入到 MySQL

17、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 RabbitMQ

18、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 HBase

19、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 HDFS

20、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 Redis

21、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 Cassandra

22、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 Flume

23、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 InfluxDB

24、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 RocketMQ

25、Flink 从0到1学习 —— 你上传的 jar 包藏到哪里去了

26、Flink 从0到1学习 —— 你的 Flink job 日志跑到哪里去了

27、阿里巴巴开源的 Blink 实时计算框架真香

28、Flink 从0到1学习 —— Flink 中如何管理配置?

29、Flink 从0到1学习—— Flink 不可以连续 Split(分流)?

30、Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文

31、Flink 架构、原理与部署测试

32、为什么说流处理即未来?

33、OPPO 数据中台之基石:基于 Flink SQL 构建实时数据仓库

34、流计算框架 Flink 与 Storm 的性能对比

35、Flink状态管理和容错机制介绍

36、Apache Flink 结合 Kafka 构建端到端的 Exactly-Once 处理

37、360深度实践:Flink与Storm协议级对比

38、如何基于Flink+TensorFlow打造实时智能异常检测平台?只看这一篇就够了

39、Apache Flink 1.9 重大特性提前解读

40、Flink 全网最全资源(视频、博客、PPT、入门、实战、源码解析、问答等持续更新)

41、Flink 灵魂两百问,这谁顶得住?

42、Flink 从0到1学习 —— 如何使用 Side Output 来分流?

43、你公司到底需不需要引入实时计算引擎?

44、一文让你彻底了解大数据实时计算引擎 Flink

源码解析

1、Flink 源码解析 —— 源码编译运行

2、Flink 源码解析 —— 项目结构一览

3、Flink 源码解析—— local 模式启动流程

4、Flink 源码解析 —— standalone session 模式启动流程

5、Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Job Manager 启动

6、Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Task Manager 启动

7、Flink 源码解析 —— 分析 Batch WordCount 程序的执行过程

8、Flink 源码解析 —— 分析 Streaming WordCount 程序的执行过程

9、Flink 源码解析 —— 如何获取 JobGraph?

10、Flink 源码解析 —— 如何获取 StreamGraph?

11、Flink 源码解析 —— Flink JobManager 有什么作用?

12、Flink 源码解析 —— Flink TaskManager 有什么作用?

13、Flink 源码解析 —— JobManager 处理 SubmitJob 的过程

14、Flink 源码解析 —— TaskManager 处理 SubmitJob 的过程

15、Flink 源码解析 —— 深度解析 Flink Checkpoint 机制

16、Flink 源码解析 —— 深度解析 Flink 序列化机制

17、Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?

18、Flink Metrics 源码解析 —— Flink-metrics-core

19、Flink Metrics 源码解析 —— Flink-metrics-datadog

20、Flink Metrics 源码解析 —— Flink-metrics-dropwizard

21、Flink Metrics 源码解析 —— Flink-metrics-graphite

22、Flink Metrics 源码解析 —— Flink-metrics-influxdb

23、Flink Metrics 源码解析 —— Flink-metrics-jmx

24、Flink Metrics 源码解析 —— Flink-metrics-slf4j

25、Flink Metrics 源码解析 —— Flink-metrics-statsd

26、Flink Metrics 源码解析 —— Flink-metrics-prometheus

26、Flink Annotations 源码解析

27、Flink 源码解析 —— 如何获取 ExecutionGraph ?

28、大数据重磅炸弹——实时计算框架 Flink

29、Flink Checkpoint-轻量级分布式快照

30、Flink Clients 源码解析

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 一、美团点评实时计算演进
    1. 1.1. 美团点评实时计算演进历程
    2. 1.2. 实时计算平台
    3. 1.3. 实时计算平台架构
    4. 1.4. 业务数仓实践
  2. 2. 二、基于 Flink 的实时数仓平台
    1. 2.1. 传统数仓模型
    2. 2.2. 实时数仓模型
    3. 2.3. 准实时数仓模型
    4. 2.4. 实时数仓和传统数仓的对比
    5. 2.5. 实时数仓建设方案对比
    6. 2.6. 一站式解决方案
    7. 2.7. 为何选择 Flink?
    8. 2.8. 实时数仓平台
  3. 3. 三、未来发展与思考
    1. 3.1. 资源自动调优
    2. 3.2. 推动实时数仓建设方式升级
  4. 4. 更多 Flink 博客
    1. 4.1. Github 代码仓库
    2. 4.2. 博客
    3. 4.3. 源码解析