Flink-执行逻辑
一.简介
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。
执行交互
三.任务执行
一个TaskManager允许同时执行多个任务。这些任务可以属于同一个算子(数据并行),也可以使不同算子(任务并行),甚至还可以来自不同的应用(作业并行)。TaskManager通过提供固定数量的处理槽来控制可以并行执行的任务数。
每个处理槽可以执行应用的一部分,即算子的一个并行任务。
Flink集群启动时,会启动一个JobManager进程、至少一个TaskManager进程。在Local模式下,会在同一个JVM内部启动一个JobManager进程和TaskManager进程。当Flink程序提交后,会创建一个Client来进行预处理,并转换为一个并行数据流,这是对应着一个Flink Job,从而可以被JobManager和TaskManager执行。在实现上,Flink基于Actor实现了JobManager和TaskManager,所以JobManager与TaskManager之间的信息交换,都是通过事件的方式来进行处理。
左侧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》