2万字50张图玩转Flink面试体系

大家好,我是老兵。

本系列为大数据技术栈面试体系系列,每期将分享一个技术组件的知识全体系,并结合面试的形式由浅入深讲解。

本期将介绍大数据实时计算利器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解析StreamGraphOptimizer和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部署TaskTaskManagerJobManagerActorSystem保持通信,接受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模式会首先启动一个集群,按照配置约定,集群中包含一定数量的JobManagerTaskManager。后面所有提交的Flink Job均共享该集群内的JobManager和TaskManager,即所有的Flink Job竞争相同资源。

这样做的好处是节省作业提交资源开销(集群已存在),减少资源和线程切换工作。但是所有作业共享一个JobManager,导致JobManager压力激增,同时一旦某Job发生故障时会影响到其他作业(中断或重启)。一般仅适用于短周期小容量作业。

看下Flink-session模式的作业提交流程:

  • (1)整体流程分为两部分:yarn-session集群启动、Job提交。

  • (2)yarn-session集群启动。请求YarnRM启动JobManager,随后JobManager内部启动DispatcherFlink-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中启动JobManagerFlinkRM,并将作业提交给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作业提交

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值