Flink(10):Flink原理初探

0. 相关文章链接

1. Flink角色分工

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

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

Flink(10):Flink原理初探

Flink(10):Flink原理初探

 2. Flink执行流程

2.1. 相关文章链接

https://blog.csdn.net/sxiaobei/article/details/80861070

https://blog.csdn.net/super_wj0820/article/details/90726768

https://ci.apache.org/projects/flink/flink-docs-release-1.11/ops/deployment/yarn_setup.html

2.2. Standalone版

Flink(10):Flink原理初探

 2.3. On Yarn版

Flink(10):Flink原理初探

  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向其分配任务

3. Flink Streaming DataFlow

https://ci.apache.org/projects/flink/flink-docs-release-1.11/concepts/glossary.html#glossary

3.1. Dataflow、Operator、Partition、SubTask、Parallelism

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

Flink(10):Flink原理初探

 3.2. Operator传递模式

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

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

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

3.3. Operator Chain

Flink(10):Flink原理初探

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

3.4. TaskSlot And Slot Sharing

  • 任务槽(TaskSlot)

Flink(10):Flink原理初探

 

        每个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(10):Flink原理初探

 

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

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

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

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

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

注意:

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

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

4. Flink运行时组件

Flink(10):Flink原理初探

上一篇:给大家推荐一个下载资源的网站


下一篇:xhell配置