一.简介
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通过提供固定数量的处理槽来控制可以并行执行的任务数。
每个处理槽可以执行应用的一部分,即算子的一个并行任务。
- 客户端不是运行时和程序执行的一部分,但它用于准备并发送dataflow(JobGraph)给Master(JobManager),然后,客户端断开连接或者维持连接以等待接收计算结果。
- 当 Flink 集群启动后,首先会启动一个 JobManger 和一个或多个的 TaskManager。由 Client 提交任务给JobManager,JobManager 再调度任务到各个 TaskManager 去执行,然后 TaskManager将心跳和统计信息汇报给 JobManager。TaskManager 之间以流的形式进行数据的传输。上述三者均为独立的 JVM 进程。
- Client 为提交 Job 的客户端,可以是运行在任何机器上(与 JobManager 环境连通即可)。提交 Job 后,Client可以结束进程(Streaming的任务),也可以不结束并等待结果返回。
- JobManager 主要负责调度 Job 并协调 Task 做checkpoint,职责上很像 Storm 的 Nimbus。从 Client 处接收到 Job 和 JAR包等资源后,会生成优化后的执行计划,并以 Task 的单元调度到各个 TaskManager 去执行。
- TaskManager在启动的时候就设置好了槽位数(Slot),每个 slot 能启动一个 Task,Task 为线程。从 JobManager处接收需要部署的 Task,部署启动后,与自己的上游建立 Netty 连接,接收数据并处理。
左侧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》
公众号
名称:大数据计算
微信号:bigdata_limeng