一.简介

Flink是一个用于状态化并行流处理的分布式系统。分布式系统需要应对的常见挑战包括分配合管理集群计算资源,进程协调,持久且高可用的数据存储及故障恢复等等。

Flink在已经有的集群基础设施和服务之上专注于它的核心功能——分布式数据流处理。Flink和很多集群管理器(Yarn、Kubernetes等)都能很好地集成;同时它也可以通过配置,作为独立集群来运行,Flink没有提供分布式持久化存储,而是利用现有的分布式文件系统(HDFS)。它依赖ZooKeeper来完成高可用性设置中领导选举工作。

二.组件

JobManager

作为主进程(master process),JobManager控制着单个应用程序的执行。换句话说,每个应用都由一个不同的JobManager掌控。JobManager接收需要执行应用,该应用包含一个所谓JobGraph,即逻辑Dataflow图,以及一个打包了全部所需类、库以及其他资源JAR文件。

JobManager将JobGraph转化成名为ExecutionGraph物理Dataflow图,该图包含了那些可以并行执行的任务。

JobManager从ResourceManager申请执行任务的必要资源(TaskManager处理槽)。一旦它收到足够数量TaskManager处理槽(slot),就会将ExecutonGraph中的任务分发给TaskManager来执行。

ResourceManager

针对不同环境和资源提供者,(如Yarn、Mesos、Kubernetes或独立部署)

,Flink提供了不同ResourceManager。

ResourceManager负责管理Flink处理资源单元——TaskManager处理槽。

ResourceManager分配给TaskManager(空闲处理槽),将处理槽提供JobManager。

如果提供处理槽数无法满足JobManager请求,向资源提供者发送请求,提供容器,申请更多TaskManager进行。

负责终止空闲TaskManager,释放资源。

TaskManager

TaskManager是Flink工作进程。

每个TaskManager提供一定数量处理槽。

处理槽数目限制了一个TaskManager可执行任务数。

TaskManager启动后,会向ResourceManager注册它的处理槽。

JobManager可以向处理槽中分配任务来执行。

在执行期间,运行同一应用不同任务的TaskManager之间产生数据交换。

Dispatcher

会跨多个作业运行,它提供了一个REST接口来让我们提交需要的执行应用。一旦某个应用提交执行,Dispatcher会启动一个JobManager并将应用转交给它。REST接口意味着Dispathcher这一集群的HTTP入口可以受到防火墙的保护。Dispatcher同时还会启动一个Web UI。

执行交互

Flink-执行逻辑_大数据

三.任务执行

一个TaskManager允许同时执行多个任务。这些任务可以属于同一个算子(数据并行),也可以使不同算子(任务并行),甚至还可以来自不同的应用(作业并行)。TaskManager通过提供固定数量的处理槽来控制可以并行执行的任务数。

每个处理槽可以执行应用的一部分,即算子的一个并行任务。

Flink-执行逻辑_数据_02

(图片来源网络,具体出处不可知)
  1. 客户端不是运行时和程序执行的一部分,但它用于准备并发送dataflow(JobGraph)给Master(JobManager),然后,客户端断开连接或者维持连接以等待接收计算结果。
  2. 当 Flink 集群启动后,首先会启动一个 JobManger 和一个或多个的 TaskManager。由 Client 提交任务给JobManager,JobManager 再调度任务到各个 TaskManager 去执行,然后 TaskManager将心跳和统计信息汇报给 JobManager。TaskManager 之间以流的形式进行数据的传输。上述三者均为独立的 JVM 进程。
  3. Client 为提交 Job 的客户端,可以是运行在任何机器上(与 JobManager 环境连通即可)。提交 Job 后,Client可以结束进程(Streaming的任务),也可以不结束并等待结果返回。
  4. JobManager 主要负责调度 Job 并协调 Task 做checkpoint,职责上很像 Storm 的 Nimbus。从 Client 处接收到 Job 和 JAR包等资源后,会生成优化后的执行计划,并以 Task 的单元调度到各个 TaskManager 去执行。
  5. TaskManager在启动的时候就设置好了槽位数(Slot),每个 slot 能启动一个 Task,Task 为线程。从 JobManager处接收需要部署的 Task,部署启动后,与自己的上游建立 Netty 连接,接收数据并处理。

Flink-执行逻辑_数据_03

(算子、任务以及处理槽关系)

左侧JobGraph(应用非并行化表示)包含5个算子,其中算子A和C数据源,算子E是数据汇。算子C和算子E并行度2,其余算子并行度4。

算子最大并行度4,因此应用最少4个处理槽。

将任务以切片形式调度至处理槽中有一个好处:TaskManager中的多个任务可以在同一进程内高效执行数据交换而无需访问网络。

任务过于集中,容易使TaskManager负载变高。

通过在TaskManager内部采用线程并行(轻量,通信开销低)以及在每个主机上部署多个TaskManager进程。应用性能和资源隔离提供很大的自由度。

参考

https://liurio.github.io/2020/01/02/Flink%E6%9E%B6%E6%9E%84%E4%B8%8E%E8%B0%83%E5%BA%A6/

《Stream Processing with Apache Flink》

公众号

Flink-执行逻辑_客户端_04
名称:大数据计算
微信号:bigdata_limeng