流/批/OLAP一体的Flink引擎 |青训营笔记

145 阅读4分钟

这是我参与[第四届青训营]笔记创作的第2天。

一、Flink概述

1、大数据计算架构发展历史

屏幕截图 2022-07-28 210658.jpg Q:为什么需要流式计算?

A: 大数据实时性带来价值更大。例如在金融风控中,如果实时监测出异常交易行为,就能及时阻断风险发生。在抖音根据用户行为数据发掘用户兴趣、偏好,向用户推荐更感兴趣的内容。

2、流式计算框架对比

屏幕截图 2022-07-28 211527.jpg

Q:为什么Flink脱颖而出?

  • Exactly——Once语句
  • 状态容错 checkpoint
  • Dataflow编程模型
  • 流批一体

3、Apache Flink 开源生态

屏幕截图 2022-07-28 212118.jpg

二、Flink整体架构

1、Flink分层架构

  • SDK层:目前有三类 SQL/Table、DataStream、PYFlink。
  • 执行引擎层:不管哪一类SDK,执行引擎层都提供了统一的DAG,用来描述数据处理的pipeline。不管是流/批,都会转化为DAG图。调度层再把DAG转化成分布式模式下的Task,Task之间通过shuffle传输数据。
  • 状态存储层:负责存储算子的状态信息。
  • 资源调度层:目前Flink可以支持部署在多种环境下。

2、Flink总体架构

(1)一个Flink集群,主要包括以下俩个核心组件:

  • JobManager:负责整个任务的协调工作,包括调度Task、触发协调Task做checkpoint协调容错恢复等。
  • TaskManager:负责执行一个DateFlow Graph的各个Task以及Date Stream的buffer和数据交换。

(2)JM组件职责

屏幕截图 2022-07-28 214033.jpg

  • Dispatcher:接收作业,拉起JM来执行作业,并在JM挂掉之后恢复作业。
  • Jobmaster:管理一个job的整个生命周期,会向ResourceManager申请slot,并将task调度到对应JM上。
  • ResourceManager:负责Slot资源党的管理和调度,Task Manager拉起之后会向RM注册JM。

3、Flink作业示例

屏幕截图 2022-07-28 214333.jpg 为了更高效地分布式执行,Flink会尽可能将不同的OPerator(source)链接Chain在一起形成一个Task。这样每个Task可以在一个线程中执行,内部叫做OPeratorChain。这样可以减少切换和缓冲区交换,提高吞吐率。如下Source和Map

屏幕截图 2022-07-28 214826.jpg

4、Flink如何做到流批一体

Q:为什么可以做到流批一体?

A:批式计算是流式计算的特例。Everything is Streams,有界数据集(批)也是一种特殊的数据集。因此,理论上我们是可以用一套引擎架构来解决上述两种场景,只不过需要对不同场景支持相应的扩展性,并允许做不同的优化策略。

(1)Apache Flink主要从以下几个模块来做流批一体的:

  • SQL层
  • DataStream API层统一,流批均支持DataStream API来开发。
  • Scheduler层架构统一,支持流批场景。
  • Failover Recovery层 容错
  • shuffle service层架构统一,支持流批场景,选不同的Shuffle Service。

(2)1.12之前的Flink支持以下两种调度模式

  • EAGER模式,特点:申请一个作业所需要的全部资源,后同时调度这个作业的全部Task,采取Pipeline方式进行通信。例如Stream作业场景。
  • LAZY模式,特点:先调度上游,待上游产生数据或结束后在调度下游,类似Spark的Stage执行模式。例如Batch作业场景。

(3)最新Flink:由Pipeline数据交换方式连接的Task构成一个Pipeline region。本质上不管是流还是批都是按Pipeline region粒度来申请资源和调度任务的。

(4)Flink社区已经支持:

  • Nerry Shuffle Service:既支持Pipeline又支持Blocking,Flink模式的Shuffle Service策略。
  • Remote Shuffle Service:既支持Pipeline又支持Blocking,不过对于PIpeline模式,走Remote反而性能下降,主要是有用的batch的blocking场景,字节内部是基于CSS来实现Rss的。

三、Flink架构优化

1、/批/OLAP业务场景概述

例子:抖音红包雨,运维同学根据第一场雨情况,布局下一场雨。

屏幕截图 2022-07-29 095750.jpg Q:三种业务场景为什么可以用一套引擎来解决?

A:批式计算是流式计算的特例。Everything is Streams,有界数据集(批)也是一种特殊的数据集。因此,理论上我们是可以用一套引擎架构来解决上述两种场景,只不过需要对不同场景支持相应的扩展性,并允许做不同的优化策略。(2)而OLAP计算是一种特殊的批式计算,他对并发和实时性要求更高,只不过需要不同场景支持相应的扩展性,并允许做不同的优化策略。

OLAP场景需求:短查询作业场景、高并发支持、极致处理性能

2、Flink的OLAP优化之路

屏幕截图 2022-07-29 100451.jpg

3、Flink OLAP架构现状

  • Client:提交SQL QUery
  • GateWay:接受Client提交的SQL QUery,对SQL进行语法解析和查询优化,生成Flink作业执行计划,提交给Session集群。
  • Session Cluster:执行作业调度及计算,并返回结果。

四、Flink应用案例

(1)电商流批一体实践

(2)字节内AP引擎由HTAP提供

屏幕截图 2022-07-29 101414.jpg 把AT、TP引擎全统一到HTAP中,提供事务处理。