当前位置:   article > 正文

Flink——Flink集群架构及应用程序执行模式_springboot flink 打包到 flink运行

springboot flink 打包到 flink运行


这篇文章概述了Flink的体系结构,并描述其主要组件是如何交互以执行应用程序,并从故障中恢复的。

Flink集群架构图

Flink运行时由两种类型的进程组成:

  1. 一个JobManager
  2. 一个或多个TaskManager
    在这里插入图片描述
    图中的客户端Client不是运行时和程序执行的一部分,而是用来向JobManager准备和发送一个dataflow。之后,Client便可以与集群断开连接,或者保持连接等待接收应用进度报告之类的信息。

JobManager和TaskManager有多种启动方式:可以直接作为standalone集群启动,也可以通过YARN或Mesos之类的资源管理框架启动。TaskManager连接到JobManager,通知JobManager宣布自己可用,并请求分配task。

1. JobManager

JobManager有许多协调Flink应用程序分布式执行的职责:它决定了何时调度下一个task或者task集合,对完成的task或执行失败的task做处理,协调checkpoints,以及失败时进行恢复等等。JobManager进行有以下3中组件组成:

  • ResourceManager
    ResourceManager负责Flink集群中的资源分配与供应——它管理这task slots(slot是Flink集群中的资源调度单元)。 Flink为不同的环境和资源提供者实现了多种资源管理,比如YARN、Mesos、Kubernetes和standalone部署。在Standalone模式中,ResourceManager仅仅只分发可用TaskManager的slot,并不会启动新的TaskManager。
  • Dispatcher
    Dispatcher提供了一个REST接口来提交Flink应用程序以执行,并为每个提交的Job启动一个新的JobMaster。它还运行Flink WebUI来提供关于Job执行的信息。
  • JobMaster
    JobMaster负责管理单个JobGraph的执行。多个Job可以同时运行在Flink集群上,每个Job都会都自己的JobMaster。

Flink集群中至少有一个JobManager。对于高可用集群,必须由多个JobManager,其中一个是主节点,其他的是备节点。

2. TaskManager

TaskManager(也称为worker)用来执行任务流、缓存并交换数据流。

集群中必须至少有一个TaskManager。TaskManager中最小的资源调度单位是task slot。一个TaskManager中的task slot的数量代表着TaskManager处理task的并发数。注意多个operator是可以在同一个task中执行的。

Task和Operator Chains

对于分布式执行,Flink将operator子任务串起来形成tasks。每个task由一个线程来执行。将operators串成tasks是一种非常有用的优化:它减少了线程间切换和缓冲的开销,并在降低延时的同时增加了总体的吞吐量。这种链式的行为是可以进行配置的,详细参考chaining docs

下图中的dataflow由5个subtask执行,因此使用5个线程并行执行。
task_chains

Task slot和资源

每一个TaskManager对应着一个JVM进程,可以在单独的线程中执行一个或多个subtask。task alot是为了控制一个TaskManager可以接受多少个task,并且至少需要一个task slot。

每个task slot代表TaskManager资源的一个固定子集。一个拥有3个slot的TaskManager, 将会分配她1/3的内存给每个slot。这样对资源的划分意味着一个job中的subtask不会与其他job中的subtask进行内存上的资源竞争,而是会有一定量的预留内存。注意,目前slot只对内存进行了隔离,CPU是没有隔离的。

用户可以通过调节task slot的数量,来决定subtask之间如何进行隔离。一个TaskManager只有一个slot就意味着每个task组运行在一个单独的JVM进程中。如果一个TaskManager有多个slot,就意味着subtasks共享同一个JVM。同一个JVM中的tasks会共享TCP连接(通过多路复用)和心跳信息。它们还可以共享数据集和数据结构,从而减少每个task的开销。
在这里插入图片描述
默认情况下,Flink允许subtask共享slot,甚至这些subtask属于不同的task,只要这些task来同一个Job。结果就是,一个slot可能会容纳整个job的pipeline。允许slot共享有两个主要好处:

  1. Flink集群需要的task slot数与Job中使用的最高并行度恰好相同。不需要计算一个程序总共包含将多少个task(具有不同的并行度)。
  2. 更容易获得更好的资源利用。如果没有进行slot共享,非密集型的subtask会和密集型subtask占用同样多的资源。而使用了slot共享,将示例中的并行度从2增加到6,就可以实现堆slot资源的充分利用,同时确保负载重的subtask在TaskManager之间得到公平分配。

在这里插入图片描述

Flink Application Execution

Flink应用程序是从其main()方法生成一个或多个Flink Job的用户程序。这些Job可以在本地JVM(LocalEnvironment)中执行,也可以在远程具有多台机器的集群中执行。对于每个程序,ExecutionEnvironment提供了控制作业执行(例如,设置并行度)和外部交互的方法。

Flink应用程序中的job可以被提交到一个长时间运行的Flink Session集群上、一个专用的Flink Job集群上,或者一个Flink Application集群上。不同集群的的区别主要在于集群的生命周期和资源隔离保证。

1. Flink Session集群

  • 集群生命周期:在Flink Session集群中,客户端连接到一个已存在且长时间运行的集群,该集群可以接受多个Job的提交。甚至在所有Job都已经完成后,集群也会保持运行,直到被手动停止。因此,Flink Session集群的生命周期不与任何Flink Job的生命周期绑定。
  • 资源隔离:TaskManager slot有ResourceManager在Job提交时分配,并在Job完成时释放。因为所有的Job共享同一个集群,所以在集群资源方面存在一些竞争——比如提交Job阶段的网络带宽。这种方式的一个弊端在于,如果一个TaskManager崩溃了,那么在这个TaskManager上运行的所有Job都将会失败。类似的,如果JobManager崩溃了,它将影响集群中运行的所有Job。
  • 其他:一个预先存在集群可以节省大量申请资源和启动TaskManager的时间。在作业执行时间很短。启动时间很长可能会对端到端用户体验产生负面影响的场景下,这一点是非常重要的——在短查询的交互式分析的场景下,作业可以利用现有资源快速执行计算。

2. Flink Job集群

  • 集群生命周期:在Flink Job集群中,可用的集群管理器(如YARN、Kubernetes)用于为每个提交的Job指定一个集群,该集群仅对该Job可用。这种模式下,客户端首先会向集群管理器请求资源来启动JobManager,然后向运行在JobManger进程中的Dispatcher提交Job。然后,根据Job的资源需求惰性的分配TaskManager,一旦Job完成,Flink Job集群将会被关闭。
  • 资源隔离:JobManager中的严重错误只会影响该Flink Job集群中运行的Job。
  • 其他:因为ResourceManager必须等待外部资源管理器主键启动TaskManager进行并分配资源,所以Flink Job集群更适合长时间运行、具有高稳定性要求且对启动时间不敏感的大型Job。

3. Flink Application集群

  • 集群生命周期:Flink Application集群是一个专用的集群,它只执行一个来自一个Flink应用程序的Job,main()方法在集群在运行,而不是在客户端运行。Job提交时一个一步完成的过程:不需要我们首先启动Flink集群,然后向现有的集群会话提交Job;代替的是,将应用程序代码和依赖打包到一个可执行的jar中,然后集群的entrypoint(ApplicationClusterEntryPoint)会负责调用应用程序代码中的main()方法来提取JobGraph。例如,这允许我们像在K8s上部署应用程序一样来部署Flink应用程序。因此,Flink Application集群的生命周期与Flink应用程序的生命周期是绑定的。
  • 资源隔离:这种集群模式下,ResourceManager和Dispatcher被限定在单个Flink应用程序中,相比Flink Session集群,提供了更好的隔离。

三种集群模式优劣

Flink Session集群优劣

  • 优点:可以充分共享资源,提高资源利用率;Job运行在Flink Session集群中,方面管理。
  • 资源隔离性较差;TaskManager不容易扩展,slot资源伸缩性较差。

Flink Job集群

  • 优点:Job之间可以充分进行资源隔离;资源伸缩性较高。
  • 缺点:资源可能会造成浪费,JobManager需要消耗资源;Job管理复杂。

Flink Application集群

  • 优点:降低了客户端负载和带宽消耗;应用程序间实现了资源隔离。
  • 仅支持YARN和K8S。

参考

  1. https://ci.apache.org/projects/flink/flink-docs-release-1.11/concepts/flink-architecture.html
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/714869
推荐阅读
相关标签
  

闽ICP备14008679号