Flink架构
Flink
为了履行流式使用,要求对核算资源进行合理分配和办理。Flink有多种完结自身功用的办法:
- Flink能够和常见的集群资源办理器(YARN/K8S等)进行交互
- Flink能够运用
Standalone
(独立集群形式)来运转 - Flink能够作为一个库来运转
Flink的主要组件 & 怎么交互履行使命
Flink运转时包含两种进程:1个JobManager
,1个或多个TaskManager
。
如图所示,Client
既不是Flink运转时的一部分,也不是Flink所要履行使命的一部分。但是Client
能够作为触发使命履行的Java/Scala代码或许以命令行的形式存在: (./bin/flink run ...
)
JobManager
和TaskManager
有多种发动的办法:1. 独立集群形式(standalone) 2. 与其他集群进行交互的办法。
TaskManager
连接到JobManager
,而且宣称它们是正常可作业的,由JobManager
来分配作业给TaskManager
使命。
Flink 架构图
JobManager
JobManager
在履行Flink分布式使用的时分担任多种和谐作业:
- 决议何时调度下一个task
- 对成功完结/失利的task做出反响
- 和谐
checkpoints
- 和谐故障恢复等等
JobManager
具有三个主要的组件:
- ResourceManager
- 担任Flink集群资源的分配/收回和装备
- 办理Flink集群资源调度的最小单元 –>
task slots
- Flink关于不同的履行环境/集群环境(K8S/YARN/Standalone)供给了多种不同的
ResourceManager
,如:在Standalone
形式下,ResourceManager
只能够分配可用的TaskManager
的task slots
,并不能创建新的TaskManager
。
- Dispatcher
- 为Flink使用的履行供给了
REST
接口 - 为每个提交的使命发动一个新的
JobMaster
- 运转Flink的Web UI
- 为Flink使用的履行供给了
- JobMaster
- 办理一个单一的
JobGraph
的履行,在Flink集群中一同运转的多个Job中,每一个Job都具有一个JobMaster
- 办理一个单一的
一个Flink集群至少具有一个JobManager,高可用的分布式系统或许会具有多个JobManager。在高可用情况下,其中一个
Jobmanager
是正主,其他的JobManager
是备胎。
TaskManager
TaskManager一般还被称为Worker,TaskManager履行数据流使命,缓存、交流数据流。
在一个Flink的集群中,至少要有一个TaskManager
,task slot
是TaskManager
中资源调度的最小单位。TaskManager中task slot
的数量表明了TaskManager
一同可处理task的数量。
多个算子(operator)或许在同一个task slot中履行
Task 和 operator chains
一系列operator连接成的链叫做task,每一个task被一个线程履行,这种operator chains结构的好处:
- 减少了线程与线程之间切换和缓存所带来的开支
- 提高了吞吐量
- 减少了延时
Task Slot 和 资源
每一个TaskManager
都是一个JVM的进程,或许会在不同的线程中履行一个或多个使命。为了操控一个TaskManager
需求承受多少个使命,task slot
(使命槽)的概念产生了。
每一个TaskManager
至少要具有一个task slot
,每一个task slot
代表的是TaskManager
的混合资源的子集合。
TaskManager会将其办理的内存平分给其具有的task slot
,分配资源意味着一个作业的子使命不会和其他作业的子使命争抢资源,而是有一定数量的保存托管内存。这里不阻隔(分配)CPU的资源。
经过调整task slot
的数量,用户能够定义子使命之间怎么阻隔:
- 每一个
TaskManager
只具有一个slot
,意味着每个使命组在单独分隔的JVM中运转 - 每一个
TaskManager
具有多个slot
,意味着多个子使命同享同一个JVM - 同享同一个JVM的多个子使命之间同享TCP连接、心跳信息,分享数据以及数据结构,减小每一个使命的开支
默许情况下,Flink答应多个子使命同享同一个task slot
,只需他们是来自于同一个Job
,一个task slot
或许掌握着一个Job
的整个流水线。使命槽同享有两个好处:
- Flink 集群需求与作业中运用的最高并行度相同多的使命槽。不需求核算一个程序中包含的使命总数。
- 更容易取得更好的资源利用率。假如没有插槽同享,非密集型
source/map()
子使命将阻塞与资源密集型窗口子使命相同多的资源。经过插槽同享,将咱们示例中的基本并行度从两个增加到六个能够充分利用插槽资源,一同确保深重的子使命在 TaskManager 之间公平分配。
Flink程序的履行
Flink使用是生成一个或许多个Job
的用户程序,这些Job
能够在本地履行,也能够在长途布置的集群上布置。关于每一个程序,履行环境供给了操控使命履行以及与外界交互的办法。
Flink使用程序的Job
能够运转在: 1. Flink Session Cluster, 2. Flink Job Cluster(已抛弃), 3. Flink Application Cluster,这些选项不同的主要差异在于集群的生命周期以及资源阻隔确保。
1. Flink使用集群
Flink使用集群生命周期
Flink使用集群是一个专用于履行Flink使用Job
的集群,且main()
办法运转在集群上。
这种形式下,使命的提交是一步式的,不需求先发动一个Flink集群,再提交使命到发动的Flink集群上,而是打包使用程序和所需依赖到一个可履行的Job
Jar,集群的入口点(ApplicationClusterEntryPoint)用来担任调用main()
办法来履行这个Job
。
这种办法答应Flink像其他使用相同在K8S上布置使用,Flink使用集群的寿数和所提交的Flink使用程序绑定在了一同,使用程序完结退出,Flink使用集群也退出。
Flink使用集群资源阻隔
在Flink使用集群中,ResourceManager和Dispatcher被限定在单个Flink使用中,比较于Flink会话集群,其对资源阻隔的更好的关注。
2. Flink会话集群
Flink会话集群生命周期
客户端连接到一个预先存在的、长连接且能够提交多个使命的Flink会话集群,Flink会话集群(JobManager)需求经过手动封闭。
Flink会话集群资源阻隔
TaskManager的slot
(槽)是在提交使命的时分经过资源办理器分配的,且使命完结的时分被释放掉。因为一切的Job
同享集群的资源,所以会有一些资源竞赛的存在,比方提交作业阶段的网络带宽。这种设置带来的一个约束是:某个TaskManager
一旦溃散,一切Job运转在这个TaskManager
上的task将会失利。同样的道理,假如JobManager出了问题,那么整个集群的Job
都将会失利。
其他注意事项
具有一个预先存在的集群能够节约很多请求资源和发动 TaskManager 的时间,期望作业运用现有资源快速核算。