一、前言
最近发现玩游戏有点过头,夜里2点多还在玩,玩了一千多场亚瑟,拿到了第2次16.0分。感觉自己挺厉害,其实还是个菜。
打算最近不能玩王者了,太容易上瘾,只要有时间控制不住的玩。而且我自己特别喜欢玩1V1,虽然几分钟一局,但是不停的玩也能玩一两个小时。
记得最近一次玩,是和某市区前100的孙尚香,耗了13分钟,终于越塔斩杀。胜利后立马点击投降,退出,卸载游戏,那时都夜里2点了吧。
都不记得删了多少次王者荣耀,又多少次没隔一两天就安装回来。每次都想着不能玩了,删掉它,要好好学习。可每次都啪啪打脸,又装回来,还是游戏香。
自己的自律能力太差,想想必须戒掉。生活中还有很多别的事情要做,比如把Flink基础学完吧。我每次看到好的教程,收藏从未停止,学习从未开始。
二、Flink架构
上图是Flink官网经典的图,在很多博客都这个图。
- 左侧白色背景的框Flink Program是Flink程序,它其实不属于Flink架构,其中Client与JobManager通信
- JobManager控制着当个程序的执行,相当于大老板
- TaskManager是Flink的工作进程,一般集群里有多个,相当于一群苦逼的打工人
1. JobManager
JobManager协调和管理程序的执行。
他的主要职责包括:任务调度,检查点(checkpoints)管理,故障恢复
1、 Flink客户端负责把GobGraph(作业图)发送给JobManager;
2、 JobManager再生产ExecutionGraph(执行图)发送给TaskManager;
3、 JobManager将TaskManager执行返回的结果再返回给Flink客户端;
JobManager的内部主要包含3个部分,JobMaster、ResourceManager和Dispatcher。
1.1 JobMaster
由于早期Flink版本迭代以及中文文档比较少也比较乱。容易把JobManager和JobMaster混为一谈。
对于JobMaster,Flink Dispatcher通过JobManagerRunner将JobGraph发给JobMaster,JobMaster然后将JobGraph转换为ExecutionGraph,并分发给TaskManager执行。
1.2 ResourceManager
ResourceManager是负责资源管理,整个Flink集群只有一个。这个资源其实就是管理任务管理器的插槽slot。
注意:这个ResourceManager不是Yarn的,是Flink内置的资源管理器。
Yarn也有个ResourceManager,如果用Yarn模式,Yarn会自动管理分配资源(TaskManager的插槽)。
1.3 Dispatcher
Dispatcher提供一个REST接口让我们提交Job给JobManager(其实给JobManager中的JobMaster)。
2. TaskManager
- Flink通常有多个TaskManager,每一个TaskManager包含一定数量的插槽slot。
- 插槽的数量限制了TaskManager能够执行的任务数量。
- Flink启动后,TaskManager会向资源管理器注册它的插槽。
2.1 Task和SubTask
- 图的上面一部分是condensed view,是逻辑图 ,也就是client给JobManager的JobGraph。
- 图的下面一部分是parallelized view,是执行图,是JobManager根据JobGraph+并行度计算得到。
- Task和Subtask是不同层面上的概念,不能简单的说Subtask是Task的子任务。
- Task是逻辑图上的,Task是逻辑概念,一个Operator就代表一个Task(多个Operator被chain之后产生的新Operator算一个Operator)。
- 真正运行的时候,Task会按照并行度分成多个Subtask,Subtask是执行/调度的基本单元。 每个Subtask需要一个线程来执行。
可以看出上图中有5个subtask。记住这个在下面插槽的概念中有用。
2.2 Slot 插槽
TaskManager是一个JVM进程,在TaskManager中可以并行运行一到多个Subtask。
每个Subtask是一个线程,需要TaskManager为其分配相应的资源(内存),TaskManager使用Task Slot给Subtask分配资源。
通过调整 task slot 的数量,用户可以定义 subtask 如何互相隔离。
上一节5个绿色圆圈中的Subtask分配到不同的slot中。
当前并行度是2,此时占了5个slot。最右侧的那个slot空闲了。
默认情况下,Flink 允许 subtask 共享 slot,即便它们是不同的 task 的 subtask,只要是来自于同一作业即可。结果就是一个 slot 可以持有整个作业管道。
把并行度改成6,此时占了6个slot。此时slot利用率很高。
- 同一个application,也即同一个job中,多个 不同task的 subTask,可以运行在同一个 slot 资源槽中。
- 同一个 task 中的多个的 subTask,不能运行在一个 slot 资源槽中,他们可以分散到其他的资源槽中。