Flink-分布式运行环境

转载请标明出处: https://blog.csdn.net/silentwolfyh

目录:

1、任务和操作链

2、job管理, Task管理,客户端

3、任务槽和资源

4、后端状态

5、保存点



1、任务和操作链

       对于分布式执行,Flink将操作子任务链接到一起,形成任务。每个任务由一个线程执行。将链接操作符放入任务中是一个有用的最优化:它减少了线程到线程的切换和缓冲的开销,并在减少延迟的同时提高了总体吞吐量。

       图片说明: 下面图中的示例dataflow(一个是压缩的展示,一个展开的展示)使用5个子任务执行,因此使用5个并行线程。(其中:Parallelized view中每一个方框就是一个Subtash,也就是五个线程)
在这里插入图片描述

2、job管理, Task管理,客户端

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

  • JobManagers (也称为master)协调分布式执行。他们安排任务,协调检查点,协调故障恢复等等。总之至少有一个JobManagers。一个高可用性设置将有多个JobManagers,其中一个总是领导者,其他的都是备用的。

  • TaskManagers(也称为workers)执行数据流的一个任务(或者更具体地说,多个子任务),并缓冲和交换数据流。必须始终至少有一个TaskManager。

       JobManagersTaskManagers可以以多种方式启动:直接在机器上作为standalone cluster, 在容器中或由资源框架(如YARN或Mesos)管理。TaskManagers连接到JobManagers,宣布自己可用,并被分配工作。

       客户端不是运行时和程序执行的一部分,而是用于准备和向JobManager发送数据流。之后,客户端可以断开连接,或者保持连接以接收进度报告。客户端运行的Java / Scala程序触发执行,或者在命令行过程。

       图片说明: 当Flink系统启动时,首先启动JobManager和一至多个TaskManager。JobManager负责协调Flink系统,TaskManager则是执行并行程序的worker。当系统以本地形式启动时,一个JobManager和一个TaskManager会启动在同一个JVM中。当一个程序被提交后,系统会创建一个Client来进行预处理,将程序转变成一个并行数据流的形式,交给JobManager和TaskManager执行。
在这里插入图片描述

3、任务槽和资源

       每个worker (TaskManager)都是一个JVM进程,可以在单独的线程中执行一个或多个子任务。为了控制一个worker 接受多少任务,一个worker有一个所谓的任务槽(至少一个)。
       每个任务槽表示TaskManager资源的固定子集。例如,一个有三个插槽的TaskManager会将其托管内存的1/3分配给每个插槽。插槽的资源分配意味着子任务不会与其他作业中的子任务竞争内存,而是具有一定数量的保留托管内存。注意,这里没有发生CPU隔离;目前,插槽只分离任务的托管内存。
       通过调整任务槽的数量,用户可以定义子任务如何相互隔离。每个TaskManager有一个插槽意味着每个任务组在一个单独的JVM中运行(例如,可以在一个单独的容器中启动)。拥有多个插槽意味着更多的子任务共享同一个JVM。相同JVM中的任务共享TCP连接(通过多路复用)和心跳消息。它们还可以共享数据集和数据结构,从而减少每个任务的开销。
在这里插入图片描述
       默认情况下,Flink允许子任务共享插槽,即使它们是不同任务的子任务,只要它们来自同一个任务。结果是一个槽可以容纳整个作业管道。允许这种槽共享有两个主要好处:

  • Flink集群需要与作业中使用的最高并行度一样多的任务槽。不需要计算程序总共包含多少任务(具有不同的并行度)。

  • 更容易得到更好的资源利用。如果没有槽共享,非密集型源/map()子任务将阻塞与资源密集型窗口子任务一样多的资源。通过插槽共享,将示例中的基本并行度从2提高到6,可以充分利用有槽资源,同时确保繁重的子任务在taskmanager中公平分配。
    在这里插入图片描述

       这些api还包括一个资源组机制,可以用来防止不需要的插槽共享。
       根据经验,一个好的默认任务槽数是CPU内核数。对于超线程,每个插槽需要2个或更多的硬件线程上下文。

4、后端状态

       键/值索引存储的确切数据结构取决于所选的状态后端。一个状态后端在内存哈希映射中存储数据,另一个状态后端使用RocksDB作为键/值存储。除了定义保存状态的数据结构外,状态后端还实现了获取键/值状态的时间点快照的逻辑,并将该快照存储为检查点的一部分。
在这里插入图片描述

5、保存点

       在数据流API中编写的程序可以从保存点恢复执行。保存点允许在不丢失任何状态的情况下更新程序和Flink集群。

       保存点是手动触发的检查点,它获取程序的快照并将其写入状态后端。它们依赖于常规的检查点机制。在执行过程中,在工作节点上定期对程序进行快照,并生成检查点。为了恢复,只需要最后一个完成的检查点,旧的检查点一旦完成就可以安全地丢弃。

       保存点类似于这些定期检查点,只是它们是由用户触发的,在新检查点完成时不会自动过期。可以从命令行或通过REST API取消作业时创建保存点。

猜你喜欢

转载自blog.csdn.net/silentwolfyh/article/details/82868658