Flink 的分布式执行环境
in Note with 0 comment
Flink 的分布式执行环境
in Note with 0 comment

续上篇《Flink 的编程模型》,这篇主要关于Flink 的分布式执行环境。


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

在 Flink 分布式执行环境中,会将多个运算子任务 Operator Subtask 串起来组成一个Operator Chain,实际上就是一个算子链。每个算子会在 TaskManager 上在一个独立的线程中执行。将算子串连到任务中是一种很好的优化:它能减少线程间的数据交接和缓存,并且提高整体的吞吐,降低处理的时延。这种串联的操作,可以通过 API 来进行配置。

如下图的数据流就有5个子任务,通过5个并行的线程来执行,所示:

1547514746772-320cb24a-7249-4af8-a3a0-ee3e2625beb7-image.png

Job Managers,Task Managers,Clients

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

但 Client 不是运行是和程序执行的一部分,它是用来准备和提交数据流到 JobManagers,之后,可以断开连接或者保持连接以获取任务的状态信息。

1547514879873-0c9c11d8-5931-4eb2-8d1b-5b5e5416ca31-image.png

从上图可以分析出 Flink 运行时的整体状态。

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

每个 Worker (Task Manager) 是一个 JVM 进程,通常会在单独的线程里执行一个或者多个子任务。为了控制一个 Worker 能够接受多少个任务,会在 Worker 上抽象多个 Task Slot (至少一个)。

每个 Task Slot 代表固定的资源子集。比如一个 TaskManager 有3个Slots,每个Slot能管理对这个 Worker 分配的资源的 3分之1 的内存。 对资源分槽,意味着 Subtask 不会同其他Subtasks 竞争内存,同时可以预留一定的可用内存。目前 Task Slot 没有对CPU进行隔离,仅是针对内存。通过动态的调整 task slots 的个数,用户可以定义哪些子任务可以相互隔离。只有一个 slot 的 TaskManager 意味着每个任务组运行在一个单独 JVM 中。 在拥有多个 slot 的 TaskManager 上,subtask 共用 JVM,可以共用 TCP 连接和心跳消息,同时可以共用一些数据集和数据结构,从而减小任务的开销。

1547515482862-010e1789-1368-4b78-bc01-cf4377a17caf-image.png

默认情况下,Flink允许子任务共享 slots,即便它们是不同任务的子任务,只要属于同一个job。这样的结果就是一个 slot 会负责一个 job 的整个 pipeline。共用 slot 有两个好处:

如下图中的共享 slot 的执行模式中可以并行运行 6 个 pipeline 而上图的只可以运行 2 个pipeline。同时 APIs 也提供了资源组的机制,可以实现不想进行资源隔离的情况。

1547515808620-45df0c96-d885-4f67-b5bd-cc21b271eb39-image.png

根据经验,一个很好的默认任务槽数就是 CPU 核心数。使用超线程,每个插槽然后需要2个或更多硬件线程上下文。

State Backends (状态后端)

数据的 KV 索引信息存储在设定的状态后端的存储中。一种是内存中的 Hash map,另一种是存在 Rocksdb(KV存储)中。另外,状态后端实现了在时间点上对 KV 状态的快照,并作为 Checkpoint 的一部分存储起来。

1547515921963-74bfec53-1282-4a4e-8daf-87e7b98ced12-image.png

Savepoints (保存点)

用 Data Stream API 编写的程序可以从保存点恢复执行。保存点允许更新程序和Flink群集,而不会丢失任何状态。

保存点是手动触发的检查点,它会获取程序的 SNAPSHOT 并将其写入状态后台。他们依靠常规的检查点机制。在执行期间,程序会定期在工作节点上创建 SNAPSHOT 并生成检查点。对于恢复,仅需要最后完成的检查点,并且一旦新的检查点完成,就可以安全地丢弃旧的检查点。

Savepoints 和周期性的 Checkpoint 非常的类似,只是有两个重要的不同。一个是由用户触发,而且不会随着新的 Checkpoint 生成而被丢弃,但可以从命令行或通过 REST API 取消作业时创建保存点。


👊 结束。

Responses