Flink分布式运行环境(Distributed Runtime Environment)

目录

任务和操作算子链(Tasks and Operator Chains)

作业管理器、任务管理器和客户端(Job Managers, Task Managers, Clients)

任务槽和资源(Task Slots and Resources)

状态后端(State Backends)

保存点(Savepoints)


原文链接

任务和操作算子链(Tasks and Operator Chains)

        对于分布式执行,Flink将操作算子子任务(operator subtasks)连接到一起形成多个任务(tasks)。每个任务(笔者注:应该是子任务)由一个线程执行。将操作算子链接成任务是一种有用的优化:它减少了线程到线程的切换和缓冲开销,提高了总体吞吐量,同时减少了延迟。

        下图中的示例数据流(Dataflow)由5个子任务执行,因此有5个并行线程。

图的上半部分是Dataflow简图,有3个任务构成。第一个任务(Source和map())由两个 操作算子构成一个任务链。图的下半部分是Dataflow的并行视角,第一个任务由两个并行子任务,第二个任务也是由两个并行子任务构成,每个子任务由一个线程运行,所以共有5个线程。总之,一个任务可以分成并行的子任务,而一个子任务由一个线程单独执行,每个子任务可能含有单个操作算子,可能含有多个操作算子构成的操作算子链。

 

作业管理器、任务管理器和客户端(Job Managers, Task Managers, Clients)

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

(1)JobManagers 

        JobManagers(也叫masters)协调分布式执行。它们调度任务、协调检查点、协调故障恢复等等。集群至少有一个作业管理器,高可用(HA)集群有多个jobmanager,其中一个是leader,其他是备用的(standby)。

(2)TaskManagers 

        TaskManagers(也叫workers)执行数据流(Dataflow)的任务(或者更具体地说,子任务),缓冲和交环数据流(data streams)。必须始终至少有一个TaskManager。

        JobManagers 和TaskManagers 可以以各种方式启动:作为独立集群(standalone cluster)直接在机器上启动,或者在容器中启动,或者由Yarn或Mesos等资源框架管理。TaskManagers连接到JobManagers,通知它们可用,然后被分配任务。

       客户端(Client)不是运行时和程序执行的一部分,但用于准备数据流(Dataflow)并将其发送到JobManager。之后,客户端可以断开连接,或者保持连接以接收进度报告(progress reports)。客户端可以作为触发执行的Java/Scala程序的一部分运行,也可以在命令行进程中运行。

 图中Flink集群有一个master和2个works构成。从图中能看到以下几点:

(1)Flink Program是将程序代码生成数据流图(Dataflow graph),然后客户端通过Actor System将提交给JobManager,(2)JobManager可以对任务进行调度,检查点协调。JobManager将任务发送给TaskManager执行,JobManager可以停止或者取消任务执行;

(3)TaskManager具体来执行任务,同时将任务状态,心跳或者统计报告发送给JobManager。JobManger会将统计结果发送给客户端进行状态更新。

 

任务槽和资源(Task Slots and Resources)

        每个worker (TaskManager)都是一个JVM进程,可以在单独的线程中执行一个子任务。为了控制一个worker接受多少个任务,一个worker至少有一个的任务槽(Task Slots)。

        每个任务槽表示TaskManager的一个固定资源子集。例如,一个有3个槽的TaskManager,会将其管理的内存的1/3分配给每个槽,也就是每个槽分配到1/3资源。对资源进行分槽意味着子任务不会与其他作业的子任务争夺管理内存(managed memory),而是拥有一定数量的保留内存。注意,这里没有发生CPU隔离,当前插槽只分隔任务的托管内存。

        通过调整TaskManager的任务槽的数量,用户可以定义子任务如何相互隔离。如果每个TaskManager有一个槽意味着每个任务组在单独的JVM中运行,如果有多个槽意味着更多的子任务共享同一个JVM。这样相同JVM中的任务共享TCP连接和heartbeat消息,共享数据集和数据结构,从而减少每个任务的开销。

图中绘制了两个TaskManager,每个TaskManager对应一个JVM进程。每个进程中有3个任务槽构成,每个任务槽中有一个线程(可以含多个线程)。任务槽中是具体执行的子任务。注意到的是:Source和map()构成的任务并行度是2,每个TaskManager执行一个,keyBy()任务也是,而Sink任务的并行度是1,由第一个TaskManager执行,所以第二个TaskManager的任务槽是空的。

        默认情况下,Flink允许子任务共享插槽,即使它们是不同任务的子任务,只要它们来自相同的作业。这样,一个插槽可以容纳作业的整个管道。允许这种插槽共享有两个主要好处:

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

(2)更容易获得更好的资源利用。

图中是两个TaskManger,与之前不同的是,一个job的任务可以共享任务槽,将并行度从2提升到了6,最后一个任务槽也被利用上了。一个任务槽中含有多个线程。

 

状态后端(State Backends)

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

 

保存点(Savepoints)

        在Data Stream API 中编写的程序可以从保存点恢复执行。保存点允许更新程序和Flink集群而不会丢失任何状态。保存点是手动触发的检查点,它获取程序的快照并将其写入到状态后端。它们依赖于常规的检查点(checkpoints )机制。在执行过程中,程序定期快照工作节点并产生检查点。对于恢复,只需要最后一个完成的检查点,当一个新的检查点完成时,旧的检查点可以被安全地丢弃。保存点与这些定期检查点类似,不同之处在于它们是由用户触发的,并且在完成新的检查点时不会自动过期。保存点可以从命令行创建,也可以在通过REST API取消作业时创建。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值