Flink原理初探

Flink角色分工

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

JobManager:

它扮演的是集群管理者的角色,负责调度任务、协调 checkpoints、协调故障恢复、收集 Job 的状态信息,并管理 Flink 集群中的从节点 TaskManager。

TaskManager:

实际负责执行计算的 Worker,在其上执行 Flink Job 的一组 Task;TaskManager 还是所在节点的管理员,它负责把该节点上的服务器信息比如内存、磁盘、任务运行情况等向 JobManager 汇报。

Client:

用户在提交编写好的 Flink 工程时,会先创建一个客户端再进行提交,这个客户端就是 Client

Flink执行流程

Flink 基本工作原理_sxiaobei的博客-CSDN博客_flink原理

基于Flink1.8的Flink On Yarn的启动流程_super_wj0820的博客-CSDN博客

Apache Flink 1.11 Documentation: YARN Setup

Standalone版

On Yarn版

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

Flink Streaming Dataflow

官网关于Flink的词汇表

Apache Flink 1.11 Documentation: Glossary

Dataflow、OperatorPartitionSubTask、Parallelism

1.Dataflow:Flink程序在执行的时候会被映射成一个数据流模型

2.Operator:数据流模型中的每一个操作被称作Operator,Operator分为:Source/Transform/Sink

3.Partition:数据流模型是分布式的和并行的,执行中会形成1~n个分区

4.Subtask:多个分区任务可以并行,每一个都是独立运行在一个线程中的,也就是一个Subtask子任务

5.Parallelism:并行度,就是可以同时真正执行的子任务数/分区数

Operator传递模式

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

1.One to One模式:

两个operator用此模式传递的时候,会保持数据的分区数和数据的排序;如上图中的Source1到Map1,它就保留的Source的分区特性,以及分区元素处理的有序性。--类似于Spark中的窄依赖

2.Redistributing 模式:

这种模式会改变数据的分区数;每个一个operator subtask会根据选择transformation把数据发送到不同的目标subtasks,比如keyBy()会通过hashcode重新分区,broadcast()和rebalance()方法会随机重新分区。--类似于Spark中的宽依赖

Operator Chain

客户端在提交任务的时候会对Operator进行优化操作,能进行合并的Operator会被合并为一个Operator,

合并后的Operator称为Operator chain,实际上就是一个执行链,每个执行链会在TaskManager上一个独立的线程中执行--就是SubTask。

​​​​​​​TaskSlot And Slot Sharing

  • 任务槽(TaskSlot)

每个TaskManager是一个JVM的进程, 为了控制一个TaskManager(worker)能接收多少个task,Flink通过Task Slot来进行控制。TaskSlot数量是用来限制一个TaskManager工作进程中可以同时运行多少个工作线程,TaskSlot 是一个 TaskManager 中的最小资源分配单位,一个 TaskManager 中有多少个 TaskSlot 就意味着能支持多少并发的Task处理。

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

- TaskManager最多能同时并发执行的子任务数是可以通过TaskSolt数量来控制的

- TaskSolt有独占的内存空间,这样在一个TaskManager中可以运行多个不同的作业,作业之间不受影响。

  • 槽共享(Slot Sharing)

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

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

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

- 资源分配更加公平,如果有比较空闲的slot可以将更多的任务分配给它。

- 有了任务槽共享,可以提高资源的利用率。

注意:

slot是静态的概念,是指taskmanager具有的并发执行能力

parallelism是动态的概念,是指程序运行时实际使用的并发能力

Flink运行时组件

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

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

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

  • 作业管理器(JobManager)

    • 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager 所控制执行。
    • JobManager 会先接收到要执行的应用程序,这个应用程序会包括:作业图(JobGraph)、逻辑数据流图(logical dataflow graph)和打包了所有的类、库和其它资源的JAR包。
    • JobManager 会把JobGraph转换成一个物理层面的数据流图,这个图被叫做“执行图”(ExecutionGraph),包含了所有可以并发执行的任务。
    • JobManager 会向资源管理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上的插槽(slot)。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager上。而在运行过程中,JobManager会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。
  • 任务管理器(TaskManager)
    • Flink中的工作进程。通常在Flink中会有多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽(slots)。插槽的数量限制了TaskManager能够执行的任务数量。
    • 启动之后,TaskManager会向资源管理器注册它的插槽;收到资源管理器的指令后,TaskManager就会将一个或者多个插槽提供给JobManager调用。JobManager就可以向插槽分配任务(tasks)来执行了。
    • 在执行过程中,一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据。
  • 资源管理器(ResourceManager)
    • 主要负责管理任务管理器(TaskManager)的插槽(slot),TaskManger 插槽是Flink中定义的处理资源单元。
    • Flink为不同的环境和资源管理工具提供了不同资源管理器,比如YARN、Mesos、K8s,以及standalone部署。
    • 当JobManager申请插槽资源时,ResourceManager会将有空闲插槽的TaskManager分配给JobManager。如果ResourceManager没有足够的插槽来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。
  • 分发器(Dispatcher)
    • 可以跨作业运行,它为应用提交提供了REST接口。
    • 当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobManager。
    • Dispatcher也会启动一个Web UI,用来方便地展示和监控作业执行的信息。
    • Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式。

​​​​​​​Flink执行图(ExecutionGraph)

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

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

原理介绍

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

简单理解:

StreamGraph:最初的程序执行逻辑流程,也就是算子之间的前后顺序--在Client上生成

JobGraph:将OneToOne的Operator合并为OperatorChain--在Client上生成

ExecutionGraph:将JobGraph根据代码中设置的并行度和请求的资源进行并行化规划!--在JobManager上生成

物理执行图:将ExecutionGraph的并行计划,落实到具体的TaskManager上,将具体的SubTask落实到具体的TaskSlot内进行运行。

2021年大数据Flink(九):Flink原理初探相关推荐

  1. 2021年大数据Kafka(九):kafka消息存储及查询机制原理

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 kafka消息存储及查询机制原理 一.Kafka数据存储机制 ...

  2. 2021年大数据HBase(十四):HBase的原理及其相关的工作机制

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的原理及其相关的工作机制 一.HBase的flus ...

  3. 2021年大数据HBase(九):Apache Phoenix的安装

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 前言 系列历史文章 安装Phoenix 一.下载 二.安装 1.上传安装包 ...

  4. 大数据课程之Flink

    大数据课程之Flink 第一章 Flink简介 1.初识Flink Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算.Flink被设计在所有常见的集群环境中运行 ...

  5. 大数据知识面试题-Flink(2022版)

    序列号 内容 链接 1 大数据知识面试题-通用(2022版) https://blog.csdn.net/qq_43061290/article/details/124819089 2 大数据知识面试 ...

  6. 2021年大数据Hive(九):Hive的数据压缩

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive的数据压缩 一.MR支持的压缩编码 二.压缩配置 ...

  7. 2021年大数据Hadoop(二十九):​​​​​​​关于YARN常用参数设置

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...

  8. 大数据框架复习-flink

    大数据框架复习-flink flink的简单介绍 Flink 是一个面向流处理和批处理的分布式数据计算引擎,能够基于同一个 Flink 运行,可以提供流处理和批处理两种类型的功能. 在 Flink 的 ...

  9. 2021年大数据Kafka(一):❤️消息队列和Kafka的基本介绍❤️

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 消息队列和Kafka的基本介绍 一.什么是消息队列 二.消息队列的应用场景 ...

  10. 2021年大数据工程师面试内容包括哪些?

    2021年大数据工程师面试内容包括哪些? [导语]近年来,大数据发展如火如荼,很多人都选择学习大数据专业或者转行大数据,大数据里又包含很多就业岗位,所以在进行岗位选择的时候,还是需要大家合理选择,为了 ...

最新文章

  1. 7天搞定图神经网络,实战助力新冠疫情防控!
  2. 0宽字符加密_前端AES加密方式分析,及其python实现
  3. python学习(1)
  4. 超详综述 | 基于深度学习的命名实体识别
  5. VTK:Rendering之Rainbow
  6. css3是什么 ptml_CSS3
  7. SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解
  8. 智能优化算法:吉萨金子塔建造优化算法-附代码
  9. 控制沟通-监控过程组
  10. XCodeGhost 病毒检查方法
  11. Python读写Excel实现大量数据处理
  12. 电子行业使用erp生产管理系统有哪些作用?常见模块有哪些?
  13. 计算机电子电路原理图,经典六款电路图集锦(图文)
  14. 让你心动的20句励志文案
  15. Client network socket disconnected before secure TLS connection was established
  16. CSS选择器(id选择器,包含选择器,标签名选择器,类选择器,属性选择器,通配符选择器,伪类选择器,相邻选择器,选择器的优先级,子选择器)
  17. TCP协议从入门到精通
  18. 3D可视化黑科技,VR线上智慧城市在线三维展示
  19. 【数值分析实验MATLAB】数值积分:梯形公式、辛普森公式、复化梯形公式、复化辛普森公式、龙贝格算法、自适应求积方法
  20. docker 根据镜像名称查找容器并删除

热门文章

  1. Python 标准库之 Queue
  2. 【Sql Server】数据库的安全机制
  3. Python | 安装Jupyter Notebook及其目录的更改 jupyter问题
  4. pip、conda 换国内源,大大提高下载速度
  5. Conversion error:Jekyll::Converters::Scss encountered an error while converting css/main.scss
  6. CVPR2020:基于层次折叠的跳跃式注意网络点云完成
  7. CVPR2020论文解析:视频语义检索
  8. EventBus的粘性事件原理
  9. 2021年大数据常用语言Scala(五):基础语法学习 字符串
  10. [JS]题解 | #魔法数字#