大家好,我是老兵。
本系列为大数据技术栈面试体系
系列,每期将分享一个技术组件的知识全体系,并结合面试的形式由浅入深讲解。
本期将介绍大数据实时计算利器Flink面试体系,全文内容已制作成PDF。
一 基础篇
1 简单介绍下Flink及使用场景
Apache Flink是开源的大数据实时计算框架,具有分布式、高性能、内存计算等特点。Flink因其独特的流批一体
设计模式,被广泛应用于实时
和离线
数据应用场景。
Flink被称为第四代大数据计算引擎,在其前面存在Mapreduce、Storm、Spark等计算框架。在流处理领域中,Flink是目前最全面、最强大的实时计算引擎。
结合官网的示意图,我们来看下Flink的工作场景。
-
数据源:支持多种数据源接入。包含事务型数据库、日志、IOT设备、点击事件等数据。
-
处理层:基于Yarn|K8s调度引擎和HDFS|S3存储组件,提供完整的
事件驱动
、时间语义
、流&批一体
的Flink计算服务。 -
应用层:输出端提供应用系统、事件日志、存储系统等数据对接。
2 Flink编程模型了解吗
1)Flink分层模型
Flink底层通过封装和抽象,提供四级分层编程模型,以此支撑业务开发实时和批处理程序。
结合示意图,我们由下而上进行介绍。
-
Runtime层:
Flink程序的最底层入口。提供基础的核心接口完成流、状态、事件、时间等复杂操作,功能灵活但使用成本较高,一般面向源码研发人员。 -
DataStream/Dataset API层:
这一层主要面向开发者。基于Runtime层抽象为两类API,其中DataStream API处理实时流程序;Dataset API处理批数据程序。 -
Table API:
统一DataStream/DataSet API,抽象成带有Schema信息的表结构API。通过Table操作和注册表完成数据计算,支持与DataStream/Dataset相互转换。 -
SQL:
面向数据分析和开发人员,抽象为SQL操作,降低开发门槛和平台化。
2)Flink计算模型
Flink的计算模型和Spark的模型有些类似。包含输入端(source)、转换(Transform)、输出端(sink)。
-
source端
:Flink程序的输入端,支持多个数据源对接 -
Transformation
:Flink程序的转换过程,实现DataStream/Dataset的计算和转换 -
sink端
: Flink的输出端,支持内部和外部输出源
具体的Flink计算模型(算子)详情,可以参考我的文章:一网打尽Flink算子大全
3 聊聊Flink的工作原理
主要考察对Flink的内部运行机制的了解程度,需要重点注意Flink中的重要角色组件及其协作机制。
Flink底层执行分为客户端
(Client)、Job管理器
(JobManager)、任务执行器
(TaskManager)三种角色组件。其中Client负责Job提交;JobManager负责协调Job执行和Task任务分配;TaskManager负责Task任务执行。
Flink常见执行流程如下(调度器不同会有所区别):
-
1)用户提交流程序Application。
-
2)Flink
解析StreamGraph
。Optimizer
和Builder模块解析程序代码,生成初始StreamGraph
并提交至Client
。 -
3)Client
生成JobGraph
。上述StreamGraph由一系列operator chain构成,在client中会被转换为JobGraph
,即优化多个chain为一个节点,最终提交到JobManager
。 -
4)JobManager
调度Job
。JobManager和Client的ActorSystem
保持通信,并生成ExecutionGraph
(并行化JobGraph)。随后Schduler和Coordinator模块协调并调度Jobz执行。 -
5)TaskManager
部署Task
。TaskManager
和JobManager
的ActorSystem
保持通信,接受job调度计划
并在内部划分TaskSlot
部署执行Task任务
。 -
6)Task
执行
。Task执行期间,JobManager、TaskManager和Client之间保持通信,回传任务状态
和心跳信息
,监控任务执行。
4 公司怎么提交Flink实时任务的?谈谈流程
顾名思义,这里涉及Flink的部署模式内容。一般Flink部署模式除了Standalone之外,最常见的为Flink on Yarn和Flink on K8s模式,其中Flink on Yarn模式在企业中应用最广。
Flink on Yarn模式细分由可以分为Flink session、Flink per-job和Flink application模式,下面我们逐一说明。
1)Flink session模式
Flink Session模式会首先启动一个集群
,按照配置约定,集群中包含一定数量的JobManager
和TaskManager
。后面所有提交的Flink Job均共享该集群内的JobManager和TaskManager,即所有的Flink Job竞争相同资源。
这样做的好处是节省作业提交资源开销(集群已存在),减少资源和线程切换工作。但是所有作业共享一个JobManager,导致JobManager
压力激增,同时一旦某Job发生故障时会影响到其他作业(中断或重启)。一般仅适用于短周期
、小容量
作业。
看下Flink-session模式的作业提交流程:
-
(1)整体流程分为两部分:yarn-session集群启动、Job提交。
-
(2)
yarn-session集群启动
。请求YarnRM
启动JobManager
,随后JobManager内部启动Dispatcher
和Flink-yarnRM
进程,等待后续Job提交
。 -
(3)Client提交Job。Client连接
Dispatcher
开始提交Job,包含jars
和解析过的JobGraph
拓扑数据结构。 -
(4)Dispatcher启动
JobMaster
,JobMaster向Yarn RM请求slots资源
。 -
(5)
Flink-Yarn RM
向Yarn RM请求Container
资源,准备启动TaskManager。 -
(6)Yarn启动
TaskManager进程
。TaskManager同时向Flink RM反向注册(自身可用的slots槽数) -
(7)TaskManager为新的作业提供slots,与JobMaster通信。
-
(8)JobMaster将执行的
任务分发
给TaskManager,开始部署执行任务
2)Flink Per-job模式
Flink Per-job模式为每个提交的作业启动集群,各集群间相互独立,并在各自作业完成后销毁,最大限度保障资源隔离。每个Job均衡分发
自身的JobManager,单独进行job的调度和执行。
虽然该模式提供了资源隔离,但是每个job均维护一个集群,启动、销毁以及资源请求消耗时间长,因此比较适用于长时间的任务执行(批处理任务)。
Per-job模式在Flink 1.15中弃用,目前推荐使用applicaiton模式。
看下Flink Per-job模式的作业提交流程:
-
(1)首先Client提交作业到
YarnRM
,包括jars和JobGraph
等信息。 -
(2)YarnRM分配Container启动
AppMaster
。AppMaster中启动JobManager
和FlinkRM
,并将作业提交给JobMaster
。 -
(3)JobMaster向YarnRM请求资源(
slots
)。 -
(4)FlinkRM向
YarnRM
请求container
并启动TaskManager
。 -
(6)TaskManager启动之后,向
FlinkRM
注册自己的可用任务槽。 -
(7)TaskManager向FlinkRM反向
注册
(自身可用的slots槽数
) -
(8)TaskManager为新的作业提供
slots
,与JobMaster通信。 -
(9)JobMaster将执行的
任务分发
给TaskManager,开始部署执行任务
3)Flink application模式
Flink application模式综合Per-job和session的优点,为每个·Application·创建独立的集群(JobManager),允许每个Application中包含多个job作业提交