大家好,我是雷恩Layne,这是《深入浅出flink》系列的第三篇文章,我旨在用最直白的语言写好flink,希望能让所有看到的人一目了然。如果大家喜欢,欢迎点赞、关注,也欢迎留言,共同交流flink的点点滴滴 O(∩_∩)O
文章目录
本文是理解flink整个架构的核心,是最基础也是必须要掌握的知识,只有完全理解了它们,你才会在以后学习flink时游刃有余,才能更好的进阶flink高阶知识。
那么,我们就开始吧!
我们知道,用户在客户端提交一个作业(Job)到服务端。服务端为分布式的主从架构。JobManager(master)负责计算资源(TaskManager)的管理、任务的调度、检查点(checkpoint)的创建等工作,而TaskManager(worker)负责SubTask的实际执行。当服务端的JobManager接收到一个Job后,会按照各个算子的并发度将Job拆分成多个SubTask,并分配到TaskManager的Slot上执行。
那么,Slot是什么,它是通过什么运行任务的?它是线程又是什么关系?不同SubTask之间是如何关联在一起的?Slot又该如何管理task?让我们带着这些问题继续往下看!
1. Job、Task、SubTask、Slot、Slotsharing、Thread、Parallelism的概念
本小节就来对Flink涉及到的Job、Task、SubTask、 Slot、Slotsharing、Thread、Parallelism等概念进行详细介绍。
首先,Job最容易理解,一个Job代表一个可以独立提交给Flink执行的作业,我们向JobManager提交任务的时候就是以Job为单位的,只不过一份代码里可以包含多个Job(每个Job对应一个类的main函数)。
说明如下:
- 图中每个圆代表一个Operator(算子),每个虚线圆角框代表一个Task,每个虚线直角框代表一个Subtask,其中的p表示算子的并行度。
- 最上面是StreamGraph,在没有经过任何优化时,可以看到包含4个Operator/Task:Task A1、Task A2、Task B、Task C。
- StreamGraph经过Chain优化(后面讲)之后,Task A1和Task A2两个Task合并成了一个新的Task A(可以认为合并产生了一个新的Operator),得到了中间的JobGraph。
- 然后以并行度为2(需要2个Slot)执行的时候,Task A产生了2个Subtask,分别占用了
Thread #1
和Thread #2
两个线程;Task B产生了2个Subtask,分别占用了Thread #3
和Thread #4
两个线程;Task C产生了1个Subtask,占用了Thread #5
。
由此可以总结如下:
-
Task是逻辑概念,一个Operator就代表一个Task(多个Operator被chain之后产生的新Operator算一个Operator);
-
真正运行的时候,Task会按照并行度分成多个Subtask,Subtask是执行/调度的基本单元;
-
每个Subtask需要一个线程(Thread)来执行。
前面讲了TaskManager才是真正干活的,启动的时候,它会将自己的资源以Slot的方式注册到master节点上的资源管理器(ResourceManager)。JobManager从ResourceManager处申请到Slot资源后将自己优化过后的SubTask调度到这些Slot上面去执行。在整个过程中SubTask是调度的基本单元,而Slo