[ 2021春节 Flink打卡第一弹] -- 原理架构

一 有界流 无界流

流处理与批处理
• MapReduce、Spark只支持批处理任务
• Storm只支持流处理任务
Spark Streaming采用了一种micro-batch的架构实现了流处理
• Flink通过灵活的执行引擎,能够同时支持批处理任务与流处理任务

Spark vs Flink 
数据模型
• Spark采用RDD模型,Spark Streaming的DStream实际上也就是一组组小批数据RDD的集合
• Flink基本数据模型是数据流,以及事件(Event)序列

运行时架构
• Spark是批计算,将DAG划分为不同的stage,一个完成后才可以计算下一个
• Flink是标准的流执行模型,一个事件在一个节点处理完后,可以直接发往下一个节点进行处理

有界流
ExecutionEnvironment 用户获得执行的环境
DataSet  flatMap filter  map group sum 等

无界流 -- 实时流
StreamExecutionEnvironment 封装了无界流计算使用的环境信息
DataStream 是Flink生态中进行无界流数据计算的核心api DataSet  flatMap keyBy  sum 等

Flink  流批统一。 1.9.1之后 离线处理(有界流) 实时处理(无界流)的API 进行了统一,底层用的都是无界流的API。
有界流是无界流中的一个特例。可以用无界流的API编写有界的程序。
Source - 》Transformation -》 Sink

二、Flink on Yarn的两种运行方式

a. 模式一 session 方式,所有的 flink job 都运行同一个flink集群中,flink集群一直驻留在yarn中。

b. 模式二 per job 方式, 每个 flink job  都会开启一个flink集群,运行完毕之后flink集群就会释放。

1. 启动一个yarn session

在Yarn中初始化一个flink集群,开辟指定的资源,以后提交任务都向这里提交。这个flink集群会常驻在Yarn集群中,除非手动停止。

YarnSessionClusterEntrypoint即为Flink在Yarn上的ApplicationMaster,同时也是JobManager;
YarnTaskExecutorRunner负责接收 subTask,并运行,就是TaskManager

a. 在 YARN 上启动 long running 的 flink 集群(yarn session)

     启动yarn-session,也就是:创建一个 YARN 模式的 flink 集群

	 ./yarn-session.sh -n 2 -s 2 -jm 1024 -tm 1024 -nm test -d
	 
	 其中:
	-n(--container):TaskManager的数量。
	-s(--slots):	每个TaskManager的slot数量,默认一个slot一个core,默认每个taskmanager的slot的个数为1,有时可以多一些taskmanager,做冗余。
	-jm:JobManager的内存(单位MB)。
	-tm:每个taskmanager的内存(单位MB)。
	-nm:yarn 的appName(现在yarn的ui上的名字)。 
	-qu,--queue <arg> Specify YARN queue.
	-d:后台执行。

b.启动应用类

启动之后,flink job共享yarn session开辟的空间,运行在flink分布式集群中

./flink run -c xxx.BatchWordCountApp  wc.jar  --input input.txt --output output.csv

 

运行过程中进程分析

开始启动进程
CliFrontend  →提交flink job到集群中去执行的shell脚本对应的进程,提交之后,就会结束
YarnSessionClusterEntrypoint→ 等价于 ApplicationMaster + JobManager

运行中的进程
YarnTaskExecutorRunner→ 等价于 TaskManager进程,负责进行计算
YarnSessionClusterEntrypoint→ 等价于 ApplicationMaster + JobManager

执行结束后进程
YarnSessionClusterEntrypoint →一直驻留在yarn中

 

2. per job。  在 YARN 上运行单个 flink job

每次提交都会创建一个新flink集群,任务之间互相独立,互不影响,方便管理。任务执行完成之后创建的集群也会消失。
AM启动类是YarnJobClusterEntrypoint , flink 里的主进程, 即Jobmanager

YarnTaskExecutorRunner  即TaskManager,负责接收subTask,并运行。即负责进行计算

运行方式

	flink run -m yarn-cluster -yn 2  -c  xxx.BoundDataFlowDemo  -d ./ok.jar args[0] args[1]

	常用的配置有:
	● -yn,--yarncontainer <arg> Number of Task Managers
	● -yqu,--yarnqueue <arg> Specify YARN queue.
	● -ys,--yarnslots <arg> Number of slots per TaskManager

 

运行过程中进程分析

开始启动进程
CliFrontend  →提交flink job到集群中去执行的shell脚本对应的进程,提交之后,就会结束
运行中的进程
YarnJobClusterEntrypoint → 用于启动AM(ApplicationMaster),就是Flink集群中JobManager

YarnTaskExecutorRunner  即TaskManager,负责接收subTask,并运行。即负责进行计算

执行结束后进程
进程都结束了。

共性

1. CliFrontend是所有job的入口类,通过解析传递的参数(jar包,mainClass等),读取flink的环境,配置信息等,封装成PackagedProgram,最终通过ClusterClient提交给Flink集群。

2.若是无界流的话,效果是一样的。都在运行中,没有退出。但是内部原理不同。
session方式所有的无界流应用运行在同一个flink集群中;per job方式每个flink应用会开启一个flink分布式集群。

区别

是无界流的话,效果是一样的。都在运行中,没有退出。但是内部原理不同。session方式所有的无界流应用运行在同一个flink集群中;per job方式每个flink应用会开启一个flink分布式集群。

总结

session
共享Dispatcher 与ResourceManager
共享资源(即 TaskExecutor )
适合规模小,执行时间短的作业

per-job
独享Dispatcher 与ResourceManager
按需要申请资源(即 TaskExecutor )
适合执行时间较长的大作业

 

三、Flink 组件介绍
 

1. JobManager 和 TaskManager

JobManager
控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager 所控制执行。
JobManager 会向资源管理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上的插槽(slot)。
  一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager 上。
  而在运行过程中,JobManager 会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。

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

ResourceManager
主要负责管理任务管理器(TaskManager)的插槽(slot),TaskManger 插槽是 Flink中定义的处理资源单元。
当 JobManager 申请插槽资源时,ResourceManager会将有空闲插槽的 TaskManager分配给 JobManager。
如果 ResourceManager 没有足够的插槽来满足 JobManager 的请求,它还可以向资源提供平台发起会话,以提供启动 TaskManager进程的容器
ResourceManager 还负责终止空闲的 TaskManager,释放计算资源

 

如果 JobManager 进程异常退出,则 YarnResourceManager 会重新调度JobManager 到其他机器
如果 TaskManager 进程异常退出,JobManager 会收到消息并重新向 Yarn的ResourceManager 申请资源,重新启动 TaskManager
 

2. TaskManager 和 slots

Flink中每一个work(TaskManager)都是一个JVM进程,它可能会在独立的线程上执行一个或者多个subtask

为了控制一个work(TaskManager)能接收多个task,work(TaskManager)通过task slot 来进行控制(一个work至少有一个 task slot )   

Task Slot 是 TaskMnager具有的并发执行能力。

一个slot一个cpu核心,同时只能是一个线程,一次只能执行一个任务。执行完了,才可以执行另一个任务                                                                                                                                                                                                                                                                                                                                                                     

并行度的设置方式
方式1:配置文件flink-conf.yaml
方式2:命令行参数方式 flink run -p 并行度
方式3:代码方式之全局设定 env.setParallelism(1)
方式4:代码方式之局部设定
如: xxx.sum(1).setParallelism(1)
  xxx.print.setParallelism(2)   

counts.writeAsCsv(outputPath,"\n","“”).setParallelism(1) ; 最终结果保存到一个文件中                                                                                                                                                                                                                                                                                                                                                                                                                             

3.任务提交流程

                                                                                                                                                                                                                                                                                                                                                                                                                                          

4.并行度(Parallelism)

Flink 程序的执行具有并行、分布式的特性。
• 在执行过程中,一个流(stream)包含一个或多个分区(stream partition),而每一个算子(operator)可以包含一个或多个子任务(operator subtask),这些子任务在不同的线程、不同的物理机或不同的容器中彼此互不依赖地执行。
• 一个特定算子的子任务(subtask)的个数被称之为其并行度(parallelism)。
• 一般情况下,一个流程序的并行度,可以认为就是其所有算子中最大的并行度。
• 一个程序中,不同的算子可能具有不同的并行度

Stream 在算子之间传输数据的形式可以是 one-to-one(forwarding)的模式也可以是 redistributing 的模式,具体是哪一种形式,取决于算子的种类。
•One-to-one:类似于 spark 中的窄依赖。stream(比如在 source 和 map operator 之间)维护着分区以及元素的顺序。那意味着 map算子的子任务看到的元素的个数以及顺序跟 source 算子的子任务生产的元素的个数、顺序相同,map、fliter、flatMap 等算子都是 one-to-one 的对应关系。
•Redistributing:类似于 spark 中的宽依赖,stream(map()跟 keyBy/window 之间或者 keyBy/window 跟 sink之间)的分区会发生改变。

每一个算子的子任务依据所选择的 transformation 发送数据到不同的目标任务。例如,keyBy() 基于 hashCode 重分区、broadcast和 rebalance会随机重新分区,这些算子都会引起 redistribute 过程,而 redistribute 过程就类似于Spark 中的 shuffle 过程

 

5.操作链(Operator Chains)

操作链介绍:
• 相同并行度的 one to one 操作,Flink 这样相连的算子链接在一起形成一个 task,原来的算子成为里面的一部分。
• 将算子链接成 task 是非常有效的优化:它能减少线程之间的切换和基于缓存区的数据交换,在减少时延的同时提升吞吐量。
• 链接的行为可以在编程 API 中进行指定。
OperatorChain的优点:
• 减少线程切换
• 减少序列化与反序列化
• 减少延迟并且提高吞吐能力
OperatorChain 组成条件(重要):
• 上下游算子并行度一致
• 上下游算子之间没有数据shuffle 

个人理解 并行度一致,且没有发生shuffle。有些类似spark中 stage划分

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

 

下篇博客内容

针对 stream 数据流中的时间,分以下三种:
• Event Time:事件产生的时间
• Ingestion time:事件进入Flink的时间
• Processing Time:事件被处理时当前系统的时间

学习资料地址

https://ververica.cn/

https://flink.apache.org/

https://flink-learning.org.cn/

 

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页