这是我参与「第四届青训营 」笔记创作活动的第2天
第二节:流/批/OLAP 一体的 Flink 引擎介绍
一、Apache Flink 概述
Apache Flink 诞生背景
什么是大数据?
指无法在一定时间用常规软件工具对其进行获取、存储、管理和处理的数据集合
- 价值化Value
- 海量化Volumes
- 快速化Velocity
- 多样化Variety
大数据计算机构发展历史
- Hadoop 诞生背景,Hadoop 解决了什么问题?(大数据十年回顾:浪潮之巅数英雄_大数据_宋词_InfoQ精选文章)
为什么需要流式计算
大数据的实时性带来的价值巨大,比如:
监控场景: 如果能实时发现业务系统的健康状态,就能提前避免业务故障
金融风控: 如果能实时监测异常交易的行为,就能及时阻断风险的发生
实时推荐: 比如在抖音,如果可以根据用户的行为数据发掘用户的兴趣、偏好,就能向用户推荐更感兴趣的内容
-
实时计算的业务场景需求、为什么会出现流式计算
- 数据实时价值更大
- 大数据批式处理分分钟级、小时级、天极,离线计算,非实时部分业务场景无法接受
-
流式计算特点:
- 实时计算、快速、低延迟
- 无限流、动态、无边界
- 7*24 持续运行
为什么Flink会脱颖而出
流式计算框架对比
WHY Flink
流批一体
Flink社区开源生态
- 流批一体:支持流式计算和批式计算;
- OLAP:Flink 可以支持 OLAP 这种短查询场景;
- Flink ML:pyFlink、ALink、AIFlow 等生态支持 Flink 在 ML 场景的应用;
- Gelly:图计算;
- Stateful Function:支持有状态的 FAAS 场景;
二、流批一体的 Apache Flink 架构
Flink分层架构
- SDK 层:Flink's APIs Overview;
-
执行引擎层(Runtime 层):执行引擎层提供了统一的 DAG,用来描述数据处理的 Pipeline,不管是流还是批,都会转化为 DAG 图,调度层再把 DAG 转化成分布式环境下的 Task,Task 之间通过 Shuffle 传输数据;
- 调度:Jobs and Scheduling;
- Task 生命周期:Task Lifecycle;
- Flink Failover 机制:Task Failure Recovery;
- Flink 反压概念及监控:Monitoring Back Pressure;
- Flink HA 机制:Flink HA Overview;
- 状态存储层:负责存储算子的状态信息
Flink总体架构
-
客户端将数据提交给JM
-
JobManager(JM)负责整个任务的协调工作,包括:调度 task、触发协调 Task 做 Checkpoint、协调容错恢复等,核心有下面三个组件:
- Dispatcher: 接收作业,拉起 JobManager 来执行作业,并在 JobMaster 挂掉之后恢复作业;
- JobMaster: 管理一个 job 的整个生命周期,会向 ResourceManager 申请 slot,并将 task 调度到对应 TM 上;
- ResourceManager:负责 slot 资源的管理和调度,Task manager 拉起之后会向 RM 注册;
- TaskManager(TM):负责执行一个 DataFlow Graph 的各个 task 以及 data streams 的 buffer 和数据交换。
Flink作业示例
Flink如何做到流批一体
为什么需要流批一体
举个例子:
- 在抖音中,实时统计一个短视频的播放量,点赞数,直播间的实时人数,送的礼物 (流)
- 在抖音中,按天统计一些创作的的数据,比如说昨天的收益是多少、播放量是多少 (批)
传统解决方案
打造两套系统,一套进行流式数据处理,一套进行批式数据处理
传统解决方案的痛点
-
人力成本比较高:批、流两套系统,相同逻辑需要开发两遍;
-
数据链路冗余:本身计算内容是一致的,由于是两套链路,相同逻辑需要运行两遍,产生一定的资源浪费;
-
数据口径不一致:两套系统、两套算子、两套 UDF,通常会产生不同程度的误差,这些误差会给业务方带来非常大的困扰。
流批一体的挑战
- 批式计算相比于流式计算核心的区别:
- 无限数据集 --> 有限数据集;
- 低延迟 --> 实时性要求不高;
Flink如何做到流批一体
-
批式计算是流式计算的特例,Everything is Streams(任何东西都是流),有界数据集(批式数据)也是一种数据流、一种特殊的数据流;
-
站在 Flink 的角度,Everything is Streams,无边界数据集是一种数据流,一个无边界的数据流可以按时间切段成一个个有边界的数据集,所以有界数据集(批式数据)也是一种数据流。因此,不管是有边界的数据集(批式数据)还是无边界数据集,Flink 都可以天然地支持,这是 Flink 支持流批一体的基础。并且 Flink 在流批一体上,从上面的 API 到底层的处理机制都是统一的,是真正意义上的流批一体。
-
Apache Flink 主要从以下几个模块来做流批一体:
- SQL 层;
- DataStream API 层统一,批和流都可以使用 DataStream API 来开发;
- Scheduler 层架构统一,支持流批场景;
- Failover Recovery 层 架构统一,支持流批场景;
- Shuffle Service 层架构统一,流批场景选择不同的 Shuffle Service;
三、Apache Flink 的 OLAP 场景面临的问题及优化思路
流/批/OLAP 业务场景概述
- 三种业务场景的特点
- 三种业务场景面临的挑战
为什么三种场景可以用一套引擎来解决
- 批式计算是流式计算的特例,Everything is Streams,有界数据集(批式数据)也是一种数据流、一种特殊的数据流;
- OLAP 计算是一种特殊的批式计算,它对并发和实时性要求更高,其他情况与普通批式作业没有特别大区别。
Flink 如何支持 OLAP 场景
- Flink做OLAP的优势
- Flink OLAP场景的挑战
-
Flink OLAP 架构现状
-
Client:提交 SQL Query;
-
Gateway:接收 Client 提交的 SQL Query,对 SQL 进行语法解析和查询优化,生成 Flink 作业执行计划,提交给 Session 集群;
-
Session Cluster:执行作业调度及计算,并返回结果。
- JobManager 管理作业的执行,在接收到 Gateway 提交过来的作业逻辑执行计划后,将逻辑执行计划转换为物理执行计划,为每个物理计算任务分配资源,将每个计算任务分发给不同的 TaskManager 执行,同时管理作业以及每个计算任务执行状态;
- TaskManager执行具体的计算任务,采用线程模型,为每个计算任务创建计算线程,根据计算任务的上下游数据依赖关系跟上游计算任务建立/复用网络连接,向上游计算任务发送数据请求,并处理上游分发给它的数据。
-
- Flink 在OLAP架构上的设想
四、Flink 使用案例
- 电商流批一体实践