这是我参加「第四届青训营 」笔记创作活动的的第15天

前语

本文首要讲述Flink的全体架构,以及流处理使命涉及的各个算子的调度编排机制。为仿照完结一个简易流处理引擎作下铺垫。详细流处理引擎编写的部分也将在后续以专栏形式进行收拾发布。

Flink 是一个散布式体系,需要有效分配和办理核算资源才能履行流式使用程序,它集成了一切常见的集群资源办理器,如 Hadoop YARN、Apache Mesos 和 Kubernetes,但也能够设置为作为独立集群甚至作为库运转。

下文包括 Flink 架构的概述,并描述其首要组件如何交互以履行使用程序并从故障中康复。

一、Flink集群分析

Flink 运转时由两种类型的进程组成:一个JobManager和一个或多个TaskManagers

一文搞懂Flink架构与任务编排|青训营笔记

Client不是运转时和程序履行的一部分,而是用于准备数据流并将其发送到 JobManager。之后,客户端能够断开衔接,或坚持衔接以接收进度报告。客户端能够作为触发履行的 Java/Scala 程序的一部分运转,也能够在命令行进程中运转./bin/flink run ...

JobManager 和 TaskManagers 能够通过多种方式发动:直接在机器上作为独立集群、在容器中或由YARN或Mesos等资源框架办理。TaskManagers 衔接到 JobManagers,宣布自己可用,并被分配工作。

二、JobManager

JobManager有许多与协调 Flink 使用程序的散布式履行相关的职责:它决定何时调度下一个使命(或一组使命),对已完结的使命或履行失利做出反响,协调检查点,并协调故障康复等。这个过程包括三个不同的部分:

ResourceManager

ResourceManager担任 Flink 集群中的资源释放/分配和供应——它办理使命,这是 Flink 集群中资源调度的单元(拜见TaskManagers)。Flink 为不同的环境和资源供给者(如 YARN、Mesos、Kubernetes 和独立布置)完结了多个 ResourceManager。在独立设置中,ResourceManager 只能分配可用 TaskManager 的插槽,不能自行发动新的 TaskManager。

Dispatcher

Dispatcher供给了一个 REST 接口来提交 Flink 使用程序履行,并为每个提交的作业发动一个新的 JobMaster。它还运转 Flink WebUI 以供给有关作业履行的信息。

JobMaster

JobMaster担任办理单个 JobGraph的履行。多个作业能够在 Flink 集群中一起运转,每个作业都有自己的 JobMaster。

总是至少有一个 JobManager。一个高可用性设置可能有多个JobManager,其间一个始终是Leader,其他是备用的。

三、TaskManager

TaskManagers(也称为workers )履行数据流的使命,缓冲和交换数据流。

必须始终至少有一个 TaskManager。TaskManager 中资源调度的最小单位是一个使命槽。TaskManager 中的使命槽数表明并发处理使命的数量。请注意,多个operator能够在一个使命槽中履行。

四、Tasks and Operator Chain

关于散布式履行,Flink将 operator 子使命链在一起形成使命。每个使命由一个线程履行。将operator链接到使命中是一种有用的优化:它削减了线程到线程切换和缓冲的开支,并在下降推迟的一起提高了全体吞吐量。

下图中的示例数据流运用五个子使命履行,因而运用五个并行线程。

一文搞懂Flink架构与任务编排|青训营笔记

五、Task Slots and Resources

每个worker(TaskManager)都是一个JVM进程,能够在不同的线程中履行一个或多个子使命。为了操控 TaskManager 承受多少使命,它有所谓的使命槽(至少一个)。

每个使命槽代表 TaskManager 的固定资源子集。例如,具有三个插槽的 TaskManager 会将其保管内存的 1/3 专用于每个插槽。分配资源意味着子使命不会与其他作业的子使命竞赛保管内存,而是保留一定数量的保管内存。请注意,这里没有发生 CPU 阻隔;现在插槽仅别离使命的保管内存。

通过调整使命槽的数量,用户能够定义子使命如何彼此阻隔。每个 TaskManager 有一个插槽意味着每个使命组在独自的 JVM 中运转(例如,能够在独自的容器中发动)。具有多个插槽意味着更多的子使命同享同一个 JVM。同一 JVM 中的使命同享 TCP 衔接(通过多路复用)和心跳消息。它们还能够同享数据集和数据结构,然后削减每个使命的开支。

一文搞懂Flink架构与任务编排|青训营笔记

默许情况下,Flink 允许子使命同享槽,即使它们是不同使命的子使命,只要它们来自同一个作业。结果是一个槽能够包容整个工作流水线。允许此插槽同享有两个首要优点:

  • Flink 集群需要与作业中运用的最高并行度相同多的使命槽。无需核算程序一共包括多少个使命(具有不同的并行度)。
  • 更简单取得更好的资源利用率。假如没有槽同享,非密布的source/map()子使命将阻塞与资源密布的窗口儿使命相同多的资源。通过槽同享,将我们示例中的根本并行度从 2 增加到 6 能够充分利用槽资源,一起确保繁重的子使命在 TaskManager 之间公正散布。

一文搞懂Flink架构与任务编排|青训营笔记

六、Flink Application Execution

Flink 使用程序是从其main()方法生成一个或多个 Flink 作业的任何用户程序。这些作业的履行能够发生在本地 JVM ( LocalEnvironment) 或具有多台机器的长途集群设置 ( RemoteEnvironment) 中。关于每个程序,都ExecutionEnvironment供给了操控作业履行(例如设置并行度)和与外界交互的方法。

Flink Application 的作业能够提交到长时刻运转的 Flink Session Cluster、专用的Flink Job Cluster或 Flink Application Cluster。这些选项之间的区别首要与集群的生命周期和资源阻隔确保有关。

Flink Session Cluster

  • 集群生命周期:在 Flink 会话集群中,客户端衔接到一个预先存在的、长时刻运转的集群,该集群能够承受多个作业提交。即使在一切作业完结后,集群(和 JobManager)仍将持续运转,直到手动停止会话。因而,Flink Session Cluster 的生命周期不受任何 Flink Job 的生命周期的束缚。
  • 资源阻隔:TaskManager 插槽由 ResourceManager 在作业提交时分配,并在作业完结后释放。因为一切作业都同享同一个集群,所以集群资源存在一些竞赛——比方提交作业阶段的网络带宽。这种同享设置的一个约束是,假如一个 TaskManager 溃散,那么一切在该 TaskManager 上运转的使命都会失利;同理,假如 JobManager 发生致命过错,会影响集群中运转的一切作业。
  • 其他注意事项:具有一个预先存在的集群能够节省大量恳求资源和发动 TaskManager 的时刻。这在作业的履行时刻十分短且发动时刻过长会对端到端用户体验产生负面影响的情况下很重要——就像短查询的交互式分析相同,在这种情况下,希望作业能够快速运用现有资源履行核算。

Flink Job Cluster

  • 集群生命周期:在 Flink 作业集群中,可用的集群办理器(如 YARN 或 Kubernetes)用于为每个提交的作业发动一个集群,而且该集群仅可用于该作业。在这里,客户端首先向集群办理器恳求资源以发动 JobManager,并将作业提交给运转在该进程内的 Dispatcher。然后根据作业的资源需求推迟分配 TaskManager。一旦作业完结,Flink Job Cluster 就会被撤除。
  • 资源阻隔:JobManager 中的致命过错仅影响在该 Flink 作业集群中运转的一项作业。
  • 其他注意事项:由于 ResourceManager 必须恳求并等候外部资源办理组件发动 TaskManager 进程并分配资源,所以 Flink Job Clusters 更适合长时刻运转、对安稳性要求高且不敏感的大型作业。

Flink Application Cluster

  • 集群生命周期:一个 Flink 使用程序集群是一个专用的 Flink 集群,它只履行来自一个 Flink 使用程序的作业,而且该 main()方法在集群上而不是客户端上运转。作业提交是一步完结的:不需要先发动一个 Flink 集群,再将作业提交到现有的集群会话;相反,您将使用程序逻辑和依赖项打包到可履行作业 JAR 中,集群进口点 ( ApplicationClusterEntryPoint) 担任调用该main()方法以提取 JobGraph。例如,这允许您像在 Kubernetes 上布置任何其他使用程序相同布置 Flink 使用程序。因而,Flink Application Cluster 的生命周期与 Flink Application 的生命周期绑定。
  • 资源阻隔:在 Flink Application Cluster 中,ResourceManager 和 Dispatcher 被限定为单个 Flink Application,它供给了比 Flink Session Cluster 更好的关注点别离。

参考文献

  1. nightlies.apache.org/flink/flink…
  1. toutiao.io/posts/o1uih…
  1. www.cnblogs.com/sfzlstudy/p…
  1. zhuanlan.zhihu.com/p/401028551