Flink架构

Flink为了履行流式使用,要求对核算资源进行合理分配和办理。Flink有多种完结自身功用的办法:

  1. Flink能够和常见的集群资源办理器(YARN/K8S等)进行交互
  2. Flink能够运用Standalone(独立集群形式)来运转
  3. Flink能够作为一个库来运转

Flink的主要组件 & 怎么交互履行使命

Flink运转时包含两种进程:1个JobManager,1个或多个TaskManager

如图所示,Client既不是Flink运转时的一部分,也不是Flink所要履行使命的一部分。但是Client能够作为触发使命履行的Java/Scala代码或许以命令行的形式存在: (./bin/flink run ...)

JobManagerTaskManager有多种发动的办法:1. 独立集群形式(standalone) 2. 与其他集群进行交互的办法。

TaskManager连接到JobManager,而且宣称它们是正常可作业的,由JobManager来分配作业给TaskManager使命。

Flink - Flink架构

Flink 架构图

JobManager

JobManager在履行Flink分布式使用的时分担任多种和谐作业:

  1. 决议何时调度下一个task
  2. 对成功完结/失利的task做出反响
  3. 和谐checkpoints
  4. 和谐故障恢复等等

JobManager具有三个主要的组件:

  1. ResourceManager
    • 担任Flink集群资源的分配/收回和装备
    • 办理Flink集群资源调度的最小单元 –>task slots
    • Flink关于不同的履行环境/集群环境(K8S/YARN/Standalone)供给了多种不同的ResourceManager,如:在Standalone形式下,ResourceManager只能够分配可用的TaskManagertask slots,并不能创建新的TaskManager
  2. Dispatcher
    • 为Flink使用的履行供给了REST接口
    • 为每个提交的使命发动一个新的JobMaster
    • 运转Flink的Web UI
  3. JobMaster
    • 办理一个单一的JobGraph的履行,在Flink集群中一同运转的多个Job中,每一个Job都具有一个JobMaster

一个Flink集群至少具有一个JobManager,高可用的分布式系统或许会具有多个JobManager。在高可用情况下,其中一个Jobmanager是正主,其他的JobManager是备胎。

TaskManager

TaskManager一般还被称为Worker,TaskManager履行数据流使命,缓存、交流数据流。
在一个Flink的集群中,至少要有一个TaskManagertask slotTaskManager中资源调度的最小单位。TaskManager中task slot的数量表明了TaskManager一同可处理task的数量。

多个算子(operator)或许在同一个task slot中履行

Task 和 operator chains

一系列operator连接成的链叫做task,每一个task被一个线程履行,这种operator chains结构的好处:

  1. 减少了线程与线程之间切换和缓存所带来的开支
  2. 提高了吞吐量
  3. 减少了延时

Flink - Flink架构

Task Slot 和 资源

每一个TaskManager都是一个JVM的进程,或许会在不同的线程中履行一个或多个使命。为了操控一个TaskManager需求承受多少个使命,task slot(使命槽)的概念产生了。

每一个TaskManager至少要具有一个task slot,每一个task slot代表的是TaskManager混合资源的子集合。

TaskManager会将其办理的内存平分给其具有的task slot,分配资源意味着一个作业的子使命不会和其他作业的子使命争抢资源,而是有一定数量的保存托管内存。这里不阻隔(分配)CPU的资源。

经过调整task slot的数量,用户能够定义子使命之间怎么阻隔:

  1. 每一个TaskManager只具有一个slot,意味着每个使命组在单独分隔的JVM中运转
  2. 每一个TaskManager具有多个slot,意味着多个子使命同享同一个JVM
  3. 同享同一个JVM的多个子使命之间同享TCP连接、心跳信息,分享数据以及数据结构,减小每一个使命的开支

Flink - Flink架构

默许情况下,Flink答应多个子使命同享同一个task slot,只需他们是来自于同一个Job,一个task slot或许掌握着一个Job的整个流水线使命槽同享有两个好处:

  1. Flink 集群需求与作业中运用的最高并行度相同多的使命槽。不需求核算一个程序中包含的使命总数。
  2. 更容易取得更好的资源利用率。假如没有插槽同享,非密集型 source/map() 子使命将阻塞与资源密集型窗口子使命相同多的资源。经过插槽同享,将咱们示例中的基本并行度从两个增加到六个能够充分利用插槽资源,一同确保深重的子使命在 TaskManager 之间公平分配。

Flink - Flink架构

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集群上,而是打包使用程序和所需依赖到一个可履行的JobJar,集群的入口点(ApplicationClusterEntryPoint)用来担任调用main()办法来履行这个Job

这种办法答应Flink像其他使用相同在K8S上布置使用,Flink使用集群的寿数和所提交的Flink使用程序绑定在了一同,使用程序完结退出,Flink使用集群也退出

Flink使用集群资源阻隔
在Flink使用集群中,ResourceManagerDispatcher被限定在单个Flink使用中,比较于Flink会话集群,其对资源阻隔的更好的关注。

2. Flink会话集群

Flink会话集群生命周期
客户端连接到一个预先存在的长连接且能够提交多个使命的Flink会话集群,Flink会话集群(JobManager)需求经过手动封闭。

Flink会话集群资源阻隔
TaskManager的slot(槽)是在提交使命的时分经过资源办理器分配的,且使命完结的时分被释放掉。因为一切的Job同享集群的资源,所以会有一些资源竞赛的存在,比方提交作业阶段的网络带宽。这种设置带来的一个约束是:某个TaskManager一旦溃散,一切Job运转在这个TaskManager上的task将会失利。同样的道理,假如JobManager出了问题,那么整个集群的Job都将会失利。

其他注意事项
具有一个预先存在的集群能够节约很多请求资源和发动 TaskManager 的时间,期望作业运用现有资源快速核算。

3. Flink作业集群(已抛弃)