流/批/OLAP 一体的 Flink 引擎介绍-复习笔记 这是我参与「第四届青训营 」笔记创作活动的的第1天!
1.Flink概述
1.1Apache Flink 诞生背景
1.1.1了解大数据概念
大数据:指无法在一定时间内用常用软件工具对其进行获取、存储、管理和处理的数据集合
1.1.2大数据特点
1.1.2.1海量化
大数据的数据量是惊人的,随着技术的发展,数据量开始爆发性增长,达到TB甚至PB级别。
1.1.2.2多样化
大数据广泛的数据来源,决定了大数据形式的多样性。大数据大体上可以分为三类,分别是结构化数据、非结构化的数据、半结构化数据。
1.1.2.3.快速化
大数据的交换和传播是通过互联网、云计算等方式实现的,远比传统媒介的信息交换和传播速度快捷。
1.1.2.4.价值化
现实中大量的数据是无效或者低价值的,大数据最大的价值在于通过从大量不相关的各种类型的数据中,挖掘出对未来趋势与模式预测分析有价值的数据。
1.1.3大数据计算架构发展历史
1.1.4为什么需要流式计算
1.1.4.1 大数据的实时性带来的价值更大
1.监控场景
2.金融风控
3.实时推荐
1.1.4.2大数据计算架构模式的变化
由批式计算变为流式计算,更快速、低延迟、无限流等
1.2为什么ApacheFlink会脱颖而出
1.2.1流式计算引擎发展历程
1.2.2.流式计算引擎对比
1.2.3.Why Flink
- Exactly-Once 精确一次的计算语义
- Checkpoint 状态容错
- Dataflow 编程模型,Window 等高阶需求支持友好
- 流批一体
1.3 Apache Flink开源生态
2.Flink整体架构
2.1 Flink分层架构
2.1.1、SDK 层-
Flink 的 SDK 目前主要有三类,SQL/Table,DataStream,PyFlink
2.1.2、执行引擎层
执行引擎层提供了统一的 DAG,用来描述数据处理的 Pipeline,不管是流还是批,都会转化为 DAG 图,调度层再把 DAG 转化成分布式环境下的 Task,Task 之间通过 Shuffle 传输数据
2.1.3、状态存储层
状态存储层负责存储算子的状态信息
2.1.4、资源调度层
目前 Flink 支持部署在多种环境。
2.2Flink总体架构
2.2.1一个Flink集群的核心组件:
-
JobManager:负责整个任务的协调工作,包括:调度 Task 、触发协调 Task 做Checkpoint、协调容错恢复等。 其中的职责:
(1)Dispatcher:
接收作业,拉起 JobManager 来执行作业,并在 JobMaster 挂掉之后恢复作业;
(2)JobMaster:
管理一个 Job 的整个生命周期,会向 ResourceManager 申请 Slot ,并将 Task 调度到对应 TM 上;
(3)ResourceManager:
负责 Slot 资源的管理与调度, TaskManager 拉起之后会向 RM 注册。 -
TaskManager:负责执行一个 DataFlow Group 的各个 task 以及 Data Streams 的 buffer 和数据交换。
2.3Flink作业示例
2.4Flink如何做到流批一体
2.4.1 为什么需要流批一体
之前架构存在痛点: (1)人力成本较高:批、流两套系统,相同逻辑需要开发两遍; (2)数据链路冗余:本身设计内容是一致的,由于是两套链路,相同逻辑需要运行两遍,产生一定的资源浪费; (3)数据口径不一致:两套系统、两套算子、两套 UDF ,通常会产生不同程度的误差,这些误差会给业务方带来非常大的困扰
2.4.2 流批一体的挑战
流和批业务场景的特点如下表:
2.4.3Flink 如何做到流批一体
不管是有边界数据集(批式数据)还是无边界数据集, Flink 都可以天然支持,这是 Flink 支持流批一体的基础。并且 Flink 在流批一体上,从上层 API 到底层的处理机制都是统一的,是真正意义上的流批一体。
2.4.4 为什么可以做到流批一体
批式计算是流式计算的特例, Everything is Streams ,有界数据集(批式数据)也是一种数据流、一种特殊的数据流。因此,理论上我们可以用一套引擎架构来解决上述两种场景,只不过需要对不同场景支持相应拓展性、并允许做不同的优化策略。
2.4.5 Apache Flink 主要从哪些模块来做流批一体
- SQL层;
- DataStream API 层统一,批和流都可以使用 DataStream API 来开发;
- Scheduler 层架构统一,支持流批场景;
- Failover Recovery 层架构统一,支持流批场景;
- Shuffle Service 层架构统一,流批场景选择不同的 Shuffle Service。
2.4.6流批一体的 Scheduler 层
Scheduler 层作用:主要负责将作业的 DAG 转化成在分布式环境中可以执行的 Task。
在1.12之前的 Flink 版本中,Flink 支持以下两种调度模式:
其中EAGER模式:16个task会一起调度,集群需要有足够的资源,而LAZY模式:最小调度一个task即可,集群有一个slot资源可以运行。
在最新的 Flink 版本中,由 Pipeline 的数据交换方式连接的 Task 构成为一个 Pipeline Region ;
本质上不管是流作业还是批作业,都是按照 Pipeline Region 粒度来申请资源和调度任务。
举例:
ALL EDGES BLOCKING
所有Task之间的数据交换都是
BLOCKING模式;
分为12个pipelineregion;
ALL_EDGES PIPELINED:
所有Task 之间的数据交换都是
PIPELINE 模式oi
分为1个pipelineregion
2.4.7流批一体的 Shuffle Service 层
Shuffle:在分布式计算中,用来连接上下游数据交互的过程叫做 Shuffle。 实际上,分布式计算中所有涉及到上下游衔接的过程,都可以理解为 Shuffle。
针对不同的计算框架,Shuffle 通常有几种不同的实现: (1)基于文件的 Pull Based Shuffle ,比如 Spark 或 MR,其特点是具有较高的容错性,适合较大规模的批处理作业,由于是基于文件的,它的容错性和稳定性会更好一些 (2)基于 Pipeline 的Push Based Shuffle,比如 Flink、 Storm、 Presto 等,其特点是低延迟和高性能,但是因为 Shuffle数据没有存储下来,如果是 Batch 任务的话,就需要进行重跑恢复。
流和批 Shuffle 之间的差异: (1)Shuffle 数据的生命周期:流作业的 Shuffle 数据与 Task 是绑定的,而批作业的 Shuffle 数据与 Task 是解耦的; (2)Shuffle 数据的存储介质:流作业的生命周期比较短,而且流作业为了实时性,Shuffle 通常存储在内存中,批作业因为数据量比较大以及容错的需求,一般会存储在磁盘里; (3)Shuffle 的部署方式:流作业 Shuffle 服务和计算节点部署在一起,可以减少网络开销,从而减少 latency,而批作业不同。
Flink 对于流和批提供两种类型 Shuffle,虽然 Streaming 和 Batch Shuffle 在具体的策略上存在一定的差异,但本质上都是为了对数据进行 Re-Partition ,因此不同的 Shuffle 之间是存在一定共性的。所以 Flink 的目标是提供一套统一的 Shuffle 架构,既可以满足不同 Shuffle 在策略上的定制,同时还能避免在共性需求上进行重复开发。
为了统一Flink在Streaming和Batch 模式下的Shuffle架构,Flink 实现了一个Pluggable的Shuffle
Service 框架,抽象出一些公共模块。
3.Flink架构优化
3.1 流/批/OLAP 业务场景概述
在实际生产环境中,针对不同的应用场景,我们对数据处理的要求是不同的:
1.有些场景下,只需离线处理数据,对实时性要求不高,但要求系统吞吐率高,典型的应用是
搜索引擎构建索引;
2.有些场景下,需对数据进行实时分析,要求每条数据处理延迟尽可能低,典型的应用是广告推荐、金融风控场景。
三种业务场景的特点:
三种业务场景解决方案的要求及带来的挑战:
3.2 为什么三种场景可以用一套引擎来解决
- 批式计算是流式计算的特例, Everything is Streams ,有界数据集(批式数据)也是一种数据流、一种特殊的数据流;
- 而 OLAP 计算是一种特殊的批式计算,它对并发性和实时性要求更高,其他情况与普通批式作业没有特别大区别。
因此,理论上我们是可以用一套引擎架构来解决上述三种场景,只不过需要对不同场景支持相应的扩展性、并运行做不同的优化策略。
3.3 Flink 如何支持 OLAP 场景
3.3.1 Flink 做 OLAP 的优势
引擎统一:降低学习成本、提高开发效率、提高维护效率; 既有优势:内存计算、Code-gen、Pipeline Shuffle、Session 模式的MPP架构; 生态支持:跨数据源查询支持、TCP-DS 基准测试性能强。
3.3.2.Flink OLAP 场景的挑战
秒级和毫秒级的小作业; 作业频繁启停,资源碎片; Latency + QPS的要求。
3.3.3.Flink OLAP 架构现状
Client:提交 SQL Query;
Gateway
接收 Client 提交的 SQLQuery,对 SQL 进行语法解析和查询优化,生成 Flink 作业执行计划,提交给 Session 集群;
Session Cluster
执行作业调度及计算,并返回结果。
3.3.4.Flink 在 OLAP 架构的问题与设想
一 架构与功能模块:
- JobManager 与 ResourceManager 在一个进程内启动,无法对 JobManager 进行水平扩展;
2.Gateway 与 Flink Session Cluster 互相独立,无法进行统一管理。
二 作业管理及部署模块: 1 JobManager 处理和调度作业时,负责的功能比较多,导致单作业处理时间长、并占用了过多的内存;
2 TaskManager 部署计算任务时,任务初始化部分耗时严重,消耗大量CPU。
三 资源管理及计算任务调度:
1 资源申请及资源释放流程链路过长;
2 Slot 作为资源管理单元,JM 管理 slot 资源,导致 JM 无法感知到 TM 维度的资源分布,使得资源管理完全依赖于 ResourceManager。
四 其他:
1 作业心跳与 Failover 机制,并不合适 AP 这种秒级或毫秒级计算场景;
2 AP 目前使用 Batch 算子进行计算,这些算子初始化比较耗时。
4.精选案例讲解
4.1 电商流批一体实践
- 目前电商业务数据分为离线数仓和实时数仓建设,离线和实时数据源,计算引擎和业务代码没有统一,在开发相同需求的时候经常需要离线和实时对齐口径,同时,由于需要维护两套计算路径,对运维也带来压力。
- 从数据源,业务逻辑,计算引擎完成统一,提高开发和运维效率。
4.2 字节Flink OLAP 场景实践
Flink的OLAP在字节内部的场景主要是HTAP场景。