Flink教程(05)- Flink原理简单分析

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: Flink教程(05)- Flink原理简单分析

01 引言

在前面的博客,我们运行了简单的Flink案例了,有兴趣的同学可以参阅下:

本文简单讲解Flink的原理。

02 Flink角色

在实际生产中,Flink 都是以集群在运行,在运行的过程中包含了两类进程。

Flink有如下角色:

  • JobManager:它扮演的是集群管理者的角色,负责调度任务、协调 checkpoints、协调故障恢复、收集Job 的状态信息,并管理Flink集群中的从节点 TaskManager
  • TaskManager:实际负责执行计算的 Worker,在其上执行Flink Job的一组 TaskTaskManager还是所在节点的管理员,它负责把该节点上的服务器信息比如内存、磁盘、任务运行情况等向 JobManager 汇报。
  • Client:用户在提交编写好的 Flink工程时,会先创建一个客户端再进行提交,这个客户端就是 Client

03 Flink执行流程

3.1 Standalone版本

3.2 on yarn

上述流程:

  1. ClientHDFS上传FlinkJar包和配置 ;
  2. ClientYarn ResourceManager提交任务并申请资源;
  3. ResourceManager分配Container资源并启动ApplicationMaster,然后AppMaster加载FlinkJar包和配置构建环境,启动JobManager;
  4. ApplicationMasterResourceManager申请工作资源,NodeManager加载FlinkJar包和配置构建环境并启动TaskManager;
  5. TaskManager启动后向JobManager发送心跳包,并等待JobManager向其分配任务。

04 Flink Streaming Dataflow

4.1 Flink相关词汇

官网关于Flink的词汇表:https://ci.apache.org/projects/flink/flink-docs-release-1.11/concepts/glossary.html#glossary

  • DataflowFlink程序在执行的时候会被映射成一个数据流模型
  • Operator:数据流模型中的每一个操作被称作OperatorOperator分为:Source/Transform/Sink
  • Partition:数据流模型是分布式的和并行的,执行中会形成1~n个分区
  • Subtask:多个分区任务可以并行,每一个都是独立运行在一个线程中的,也就是一个Subtask子任务
  • Parallelism:并行度,就是可以同时真正执行的子任务数/分区数

4.2 Operator传递模式

数据在两个Operator(算子)之间传递的时候有两种模式:

  • One to One模式:两个operator用此模式传递的时候,会保持数据的分区数和数据的排序;如上图中的Source1Map1,它就保留的Source的分区特性,以及分区元素处理的有序性。
  • Redistributing 模式:这种模式会改变数据的分区数 ,每个一个operator subtask会根据选择transformation把数据发送到不同的目标subtasks,比如keyBy()会通过hashcode重新分区,broadcast()rebalance()方法会随机重新分区。

4.3 Operator Chain

客户端在提交任务的时候会对Operator进行优化操作,能进行合并的Operator会被合并为一个Operator,合并后的Operator称为Operator chain,实际上就是一个执行链,每个执行链会在TaskManager上一个独立的线程中执行–就是SubTask

4.4 任务槽与槽共享

4.4.1 任务槽(TaskSlot)

每个TaskManager是一个JVM的进程,为了控制一个TaskManager(worker)能接收多少个taskFlink通过Task Slot来进行控制。

  • TaskSlot数量是用来限制一个TaskManager工作进程中可以同时运行多少个工作线程;
  • TaskSlot是一个TaskManager 中的最小资源分配单位;
  • 一个 TaskManager中有多少个 TaskSlot就意味着能支持多少并发的Task处理。

Flink将进程的内存进行了划分到多个slot中,内存被划分到不同的slot之后可以获得如下好处:

  • TaskManager最多能同时并发执行的子任务数是可以通过TaskSolt数量来控制的;
  • TaskSolt有独占的内存空间,这样在一个TaskManager中可以运行多个不同的作业,作业之间不受影响。

4.4.2 槽共享(Slot Sharing)

Flink允许子任务共享插槽,即使它们是不同任务(阶段)的子任务(subTask),只要它们来自同一个作业。

比如上图图左下角中的mapkeyBysink 在一个 TaskSlot里执行以达到资源共享的目的。

允许插槽共享有两个主要好处

  • 资源分配更加公平,如果有比较空闲的slot可以将更多的任务分配给它;
  • 有了任务槽共享,可以提高资源的利用率。

注意:

  • slot是静态的概念,是指taskmanager具有的并发执行能力;
  • parallelism是动态的概念,是指程序运行时实际使用的并发能力。

05 Flink运行时组件

Flink运行时架构主要包括四个不同的组件,它们会在运行流处理应用程序时协同工作:

  • 作业管理器(JobManager):分配任务、调度checkpoint做快照
  • 任务管理器(TaskManager):主要干活的
  • 资源管理器(ResourceManager):管理分配资源
  • 分发器(Dispatcher):方便递交任务的接口,WebUI

因为Flink是用JavaScala实现的,所以所有组件都会运行在Java虚拟机上,每个组件的职责如下:

5.1 作业管理器(JobManager)

  • 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager 所控制执行。
  • JobManager 会先接收到要执行的应用程序,这个应用程序会包括:作业图(JobGraph)、逻辑数据流图(logical dataflow graph)和打包了所有的类、库和其它资源的JAR包;
  • JobManager 会把JobGraph转换成一个物理层面的数据流图,这个图被叫做“执行图”(ExecutionGraph),包含了所有可以并发执行的任务;
  • JobManager会向资源管理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上的插槽(slot),一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager上,而在运行过程中,JobManager会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。

5.2 任务管理器(TaskManager)

  • Flink中的工作进程,通常在Flink中会有多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽(slots)。插槽的数量限制了TaskManager能够执行的任务数量。
  • 启动之后,TaskManager会向资源管理器注册它的插槽;收到资源管理器的指令后,TaskManager就会将一个或者多个插槽提供给JobManager调用。JobManager就可以向插槽分配任务(tasks)来执行了。
  • 在执行过程中,一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据。

5.3 资源管理器(ResourceManager)

  • 主要负责管理任务管理器(TaskManager)的插槽(slot),TaskManger 插槽是Flink中定义的处理资源单元。
  • Flink为不同的环境和资源管理工具提供了不同资源管理器,比如YARNMesosK8s,以及standalone部署。
  • JobManager申请插槽资源时,ResourceManager会将有空闲插槽的TaskManager分配给JobManager。如果ResourceManager没有足够的插槽来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。

5.4 分发器(Dispatcher)

  • 可以跨作业运行,它为应用提交提供了REST接口;
  • 当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobManager
  • Dispatcher也会启动一个Web UI,用来方便地展示和监控作业执行的信息;
  • Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式。

06 Flink执行图(ExecutionGraph)

Flink程序直接映射成的数据流图是StreamGraph,也被称为逻辑流图,因为它们表示的是计算逻辑的高级视图,为了执行一个流处理程序,Flink需要将逻辑流图转换为物理数据流图(也叫执行图),详细说明程序的执行方式。

Flink 中的执行图可以分成四层:StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图

6.1 原理

Flink执行executor会自动根据程序代码生成DAG数据流图;

Flink 中的执行图可以分成四层:StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图

  • StreamGraph :是根据用户通过 Stream API编写的代码生成的最初的图,表示程序的拓扑结构
  • JobGraph :StreamGraph经过优化后生成了JobGraph,提交给JobManager的数据结构。主要的优化为,将多个符合条件的节点 chain在一起作为一个节点,这样可以减少数据在节点之间流动所需要的序列化/反序列化/传输消耗。
  • ExecutionGraph :JobManager根据 JobGraph生成ExecutionGraphExecutionGraphJobGraph的并行化版本,是调度层最核心的数据结构。
  • 物理执行图 :JobManager 根据 ExecutionGraphJob进行调度后,在各个TaskManager 上部署 Task后形成的“图”,并不是一个具体的数据结构。

可以简单理解为:

  • StreamGraph:最初的程序执行逻辑流程,也就是算子之间的前后顺序–在Client上生成;
  • JobGraph:将OneToOneOperator合并为OperatorChain–在Client上生成
  • ExecutionGraph:将JobGraph根据代码中设置的并行度和请求的资源进行并行化规划!–在JobManager上生成
  • 物理执行图:将ExecutionGraph的并行计划,落实到具体的TaskManager上,将具体的SubTask落实到具体的TaskSlot内进行运行。
相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
10天前
|
自然语言处理 监控 数据挖掘
【Flink】Flink中的窗口分析
【4月更文挑战第19天】【Flink】Flink中的窗口分析
|
3月前
|
Java 流计算
【极数系列】Flink搭建入门项目Demo & 秒懂Flink开发运行原理(05)
【极数系列】Flink搭建入门项目Demo & 秒懂Flink开发运行原理(05)
|
7天前
|
存储 NoSQL 分布式数据库
【Flink】Flink分布式快照的原理是什么?
【4月更文挑战第21天】【Flink】Flink分布式快照的原理是什么?
|
16天前
|
运维 监控 Java
面经:Storm实时计算框架原理与应用场景
【4月更文挑战第11天】本文是关于Apache Storm实时流处理框架的面试攻略和核心原理解析。文章分享了面试常见主题,包括Storm的架构与核心概念(如Spout、Bolt、Topology、Tuple和Ack机制),编程模型与API,部署与运维,以及应用场景与最佳实践。通过代码示例展示了如何构建一个简单的WordCountTopology,强调理解和运用Storm的关键知识点对于面试和实际工作的重要性。
30 4
面经:Storm实时计算框架原理与应用场景
|
19天前
|
机器学习/深度学习 分布式计算 BI
Flink实时流处理框架原理与应用:面试经验与必备知识点解析
【4月更文挑战第9天】本文详尽探讨了Flink实时流处理框架的原理,包括运行时架构、数据流模型、状态管理和容错机制、资源调度与优化以及与外部系统的集成。此外,还介绍了Flink在实时数据管道、分析、数仓与BI、机器学习等领域的应用实践。同时,文章提供了面试经验与常见问题解析,如Flink与其他系统的对比、实际项目挑战及解决方案,并展望了Flink的未来发展趋势。附带Java DataStream API代码样例,为学习和面试准备提供了实用素材。
72 0
|
2月前
|
SQL 缓存 分布式计算
flink1.18 SqlGateway 的使用和原理分析
# 了解flink1.18 sqlGateway 的安装和使用步骤 # 启动sqlgateway 流程,了解核心的结构 # sql提交流程,了解sql 的流转逻辑 # select 查询的ResultSet的对接流程,了解数据的返回和获取逻辑
|
3月前
|
消息中间件 Kafka API
【极数系列】ClassNotFoundException: org.apache.flink.connector.base.source.reader.RecordEmitter & 详细分析解决
【极数系列】ClassNotFoundException: org.apache.flink.connector.base.source.reader.RecordEmitter & 详细分析解决
|
3月前
|
SQL 并行计算 大数据
【大数据技术攻关专题】「Apache-Flink零基础入门」手把手+零基础带你玩转大数据流式处理引擎Flink(基础加强+运行原理)
关于Flink服务的搭建与部署,由于其涉及诸多实战操作而理论部分相对较少,小编打算采用一个独立的版本和环境来进行详尽的实战讲解。考虑到文字描述可能无法充分展现操作的细节和流程,我们决定以视频的形式进行分析和介绍。因此,在本文中,我们将暂时不涉及具体的搭建和部署步骤。
498 3
【大数据技术攻关专题】「Apache-Flink零基础入门」手把手+零基础带你玩转大数据流式处理引擎Flink(基础加强+运行原理)
|
3月前
|
消息中间件 Kafka Apache
Apache Flink 是一个开源的分布式流处理框架
Apache Flink 是一个开源的分布式流处理框架
487 5
|
2月前
|
SQL Java API
官宣|Apache Flink 1.19 发布公告
Apache Flink PMC(项目管理委员)很高兴地宣布发布 Apache Flink 1.19.0。
1370 1
官宣|Apache Flink 1.19 发布公告