来自 Flink1.17 版本

Flink是一个分布式体系,需求有效分配和办理核算资源,以履行流式运用程序。它与Hadoop YARN和Kubernetes等一切常见的集群资源办理器集成,也能够设置为 standalone cluster运转甚至作为库(library)运转。

在 Flink1.11 引进 Flink Application Cluster 形式后,现在Flink有三种集群布置形式:

  • Flink Application Cluster
  • Flink Session Cluster
  • Flink Job Cluster (has been deprecated in Flink 1.15)

上述形式的不同之处在于:

  • 集群生命周期和资源阻隔确保
  • main()办法是在客户端上履行还是在集群上履行

Flink部署模式介绍

  • Application Mode:发动一个专用的JobManager来提交作业,JobManager将只履行此作业,然后退出。Flink运用程序在JobManager上运转(即 main() 办法在集群上履行)。
  • Per-Job Mode:发动一个专用的JobManager来提交作业,JobManager将只履行此作业,然后退出。Flink运用程序在提交作业的每个客户端上运转即 main() 办法在客户端上履行)。
  • Session Mode:多个job同享同一个JobManager。

在 Session Mode下,集群生命周期独立于集群上运转的任何作业的生命周期,而且资源在一切作业之间同享。Application Mode 为每个运用程序创建一个会话集群(session cluster),并在集群上履行运用程序的main()办法。因而,它具有更好的资源阻隔,由于资源仅由从单个main()办法发动的作业运用。这是认为每个运用程序增加一个专用集群为价值的。

Flink Cluster

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

Flink部署模式介绍

Flink部署模式介绍

The Client is not part of the runtime and program execution, but is used to prepare and send a dataflow to the JobManager.

Client(客户端)不是运转时和程序履行的一部分,它首要用于预备向JobManager发送数据流。

Client(客户端) 发送完数据流之后就能够断开衔接(别离形式),或坚持衔接以接收进展陈述(衔接形式)。

Client(客户端)要么在代码中触发Java/Scala程序运转;要么在命令行进程中运转./bin/flink run

JobManager 和 TaskManagers 能够经过各种方法发动:

  • directly on the machines as a standalone cluster. 直接在机器上作为 standalone 集群发动。
  • n containers, or managed by resource frameworks like YARN. 在容器中发动、经过YARN资源结构发动。

TaskManagers 衔接 JobManagers宣布自己可用而且被分配使命。

JobManager

JobManager 担任和谐Flink运用程序的分布式履行状况。决议何时安排下一个使命(或一组使命),对完结的使命或履行失利的使命做出反响,和谐检查点,和谐毛病康复等。这个进程由三个不同的部分组成:

  • ResourceManager:担任Flink集群中的资源分配和调配。办理 task slots(是Flink集群中资源调度的单位),Flink为不同的环境和资源供给商(如YARN、Kubernetes和 standalone 布置)完结了了对应的 ResourceManager。在 standalone 设置中,ResourceManager只能为可用的TaskManager分配slots,而不能独自发动新的TaskManager。
  • Dispatcher:供给了一个 REST 接口,用来提交 Flink 运用程序履行,并为每个提交的作业发动一个新的 JobMaster。它还运转 Flink WebUI 用来供给作业履行信息。
  • JobMaster:一个 JobMaster 担任办理单个 JobGraph 的履行。Flink集群中能够一起运转多个作业,每个作业都有自己的 JobMaster。

建立 Flink 集群至少要有一个JobManager;建立高可用(HA)时需求装备多个JobManagers(至少2个),其中一个是leader,其他的是 standby。

TaskManagers

TaskManagers(也称为 workers)是履行 dataflow task ,而且缓存和交换数据流。 集群中始终至少要有一个 TaskManager,在 TaskManager 中资源调度的最小单位是 task slot。TaskManager中使命槽的数量表示并发处理使命的数量。请注意,多个运算符(算子)可能在同一个 task slot 中履行

Tasks 和 算子链

关于分布式履行,Flink 将算子的 subtasks 链接成 tasks。每个 task 由一个线程履行。将算子链接成 task 是个有用的优化:它减少了线程间切换和缓冲的开支,并在降低推迟的一起提高了整体吞吐量。

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

Flink部署模式介绍

Task Slots 和资源

每个 worker(TaskManager)都是一个 JVM 进程。能够在独自的线程中履行一个或多个subtasks,为了操控TaskManager承受使命的数量,就有了所谓的 task slots(至少一个)。

每个 task slot 代表 TaskManager 中资源的固定子集。例如,有三个slot 的TaskManager 将把1/3的托管内存用于每个slot。分配资源意味着子使命不会与其他作业的子使命抢夺托管内存,而是保留必定数量的托管内存。请注意,这里没有产生CPU阻隔;当前slot仅别离使命的托管内存。

经过调整 task slot 的数量,用户能够定义如何将 subtask 彼此阻隔。

每个TaskManager有一个 slot 意味着每个使命组(task group)都在一个独自的 JVM 中运转(例如,能够在一个独立的容器中发动)。拥有多个slots意味着多个 subtask 同享同一个 JVM。同一个JVM中的 tasks 同享TCP衔接(经过多路复用)和心跳信息( heartbeat messages)。它们还能够同享数据集和数据结构,从而减少每个使命的开支。

Flink部署模式介绍

默许状况下,Flink允许 subtasks 同享slots,即便它们是不同 tasks的subtasks,只要他们来自同一个 Job。结果是,一个slot能够容纳整个工作pipeline。允许此 slot 同享有两个首要优点:

  • Flink集群需求的 task slot 与作业中运用的最高并行度是相同的。不需求核算一个程序总共包括多少使命(具有不同的并行度)。
  • 简单取得更好的资源运用。假如没有 slot 同享,非密集 subtask(source/map())将阻塞和密集型 subtask(window) 相同多的资源。经过 slot 同享,咱们示例中的基本并行度从 2 增加到 6,能够充分运用分配的资源,一起确保深重的 subtask 在 TaskManager 之间公平分配。
    Flink部署模式介绍

Flink Application Execution

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

Flink Application 的作业能够提交到长时刻运转的Flink Session Cluster、专用的 Flink Job Cluster(已弃用)或Flink Application Cluster.。它们之间的差异首要与集群的生命周期( cluster’s lifecycle)和资源阻隔(resource isolation )确保有关。

Flink Application Cluster

  • Cluster Lifecycle(集群生命周期):Flink Application Cluster 是一个专用的Flink集群,它只履行来自一个Flink运用的作业,而且main()办法在集群上运转,而不是在客户端上运转。提交作业是一个单过程进程:无需先发动 Flink 集群,然后将作业提交到现有的 session 集群;相反,将运用程序逻辑和依靠打包成一个可履行的作业 JAR 中,而且集群进口(ApplicationClusterEntryPoint)担任调用 main()办法来提取 JobGraph。它允许像在Kubernetes上布置任何其他运用程序相同布置Flink运用程序。因而,Flink运用程序集群的生存期与Flink运用的生存期相绑定。The lifetime of a Flink Application Cluster is therefore bound to the lifetime of the Flink Application.
  • Resource Isolation(资源阻隔):在 Flink Application 集群中,ResourceManager 和 Dispatcher 作用于单个的 Flink 运用程序,比较于 Flink Session 集群,它供给了更好的阻隔。

Flink Session Cluster

  • Cluster Lifecycle(集群生命周期):在 Flink Session Cluster 中,客户端衔接到一个预先存在的、长时刻运转的集群,该集群能够承受多个作业提交。即便在一切作业完结后,Cluster(JobManager)仍将持续运转,直到手动中止会话。因而,Flink会话集群的生存期不与任何Flink作业的生存期绑定。
  • Resource Isolation(资源阻隔):TaskManager slots 由ResourceManager在作业提交时分配,并在作业完结后释放。由于一切job 都同享同一个集群,所以在提交job阶段存在一些集群资源竞赛,比如网络带宽。这种同享集群设置的一个约束是,假如一个TaskManager溃散,那么一切在该TaskManager上运转使命的作业都将失利;同样,假如JobManager上产生一些丧命过错,它将影响集群中运转的一切作业。
  • Other considerations(其他注意事项):拥有预先存在的集群能够节约很多的资源请求和发动TaskManagers的时刻。这一点在作业履行时刻非常短且发动时刻过长会对端到端用户体会产生负面影响的状况下很重要,短查询的交互式分析便是如此,在这种状况下,作业能够运用现有资源快速履行核算。

Formerly, a Flink Session Cluster was also known as a Flink Cluster in session mode. 曾经,Flink会话集群也称为会话形式下的Flink集群。

Flink Job Cluster (deprecated)

Per-job mode has been deprecated in Flink 1.15. Please consider application mode to launch a dedicated cluster per-job on YARN. Per-job mode 在Flink 1.15中已被弃用。请考虑在YARN上为每个作业发动专用集群的运用程序形式。

  • Cluster Lifecycle:在 Flink Job Cluster 中,可用的集群办理器(例如 YARN)用于为每个提交的作业发动一个集群,而且该集群仅可用于该作业。在这里,Client(客户端)首先从集群办理器请求资源以发动JobManager,并将作业提交给在此进程中运转的 Dispatcher。然后,使命办理器会依据作业的资源需求进行推迟分配。一旦作业完结,Flink作业集群就会被撤除。
  • Resource Isolation:JobManager中的丧命过错只会影响在该Flink作业集群中运转的一个作业。
  • Other considerations(其他注意事项):由于 ResourceManager 必须等候外部资源办理组件来请求发动TaskManager进程和分配资源,Flink Job Clusters更合适于长时刻运转、稳定性要求高且对较长发动时刻不灵敏的大型作业。

Flink 使命提交方法

  1. Local 形式:本地测验运用
  2. StandaLone 形式:为Flink 集群的单机版提交方法,只运用一个节点进行提交,常用 Session 形式;一起 Standalone 可装备 HA 高可用提交,运用多个节点。
  3. Yarn 形式:在出产环节中运用最多,yarn 形式又包括三种形式:
  • yarn Session 形式
  • yarn per job 形式
  • yarn application 形式
  1. K8S 形式

yarn 提交方法的特色,由于在出产环境中绝大多数公司都运用 yarn 来办理资源,所以就以yarn提交方法进行重点介绍:

  1. yarn Session 形式:一切作业同享集群资源,阻隔性差,JVM 负载瓶颈,main() 办法在客户端履行,合适履行时刻短、频繁履行的短使命,集群中的一切作业只要一个 JobManager,别的 job 被随机分配给 TaskManager。

特色:yarn Session 形式需求先发动集群,然后再提交作业。

  1. yarn per job 形式:每个作业独自发动集群、阻隔性好、JVM 负载均衡、mian() 办法在客户端履行。在 per job 形式下,每个 Job 都有一个JobManager,每个TaskManager 只要一个Job。

特色:一个使命(task)只会对应一个Jon,每提交一个作业都会依据本身状况独自向 yarn 请求资源,独享 Dispatcher 和 ResourceManager,按需承受资源请求,合适规划大、运转时刻长的作业。

  1. yarn application 形式:mian() 办法在 JobManager中履行,进口点位于 ApplicationClusterEntryPoint,客户端只需求担任建议布置请求。

特色:极大缓解了客户端压力,防止资源成为一个瓶颈。