可以当做一个初步认识 Flink 的文章, 仅此而已!!!!!
我们以一个生产口罩的工厂为例来尝试理解一下Flink的整个计算流程
老板都是复制整个工厂的整体把控的, 一般不亲自动手,只需要管好 工厂的车间组长 就可以了。 JobManager 则是负责整个集群的资源管理与任务管理, 当然他不需要亲自管理,一般都是交给 TaskManager。
工厂的车间组长 也同样还是不是具体做事的人, 只需要包控下自己车间的资源和进度 ,向老板报告。 车间组长管理着这个拥有若干的生产设备车间 并有一批可用的工人。 工人们可以选择任意一个空闲的设备进行生产操作
TaskManager 负责当前节点上的任务运行及当前节点上的资源管理 并且将自己管理的内存资源划分为一个个的 TaskSlot, 同时具有一定数量的 CPU 使用这些 TaskSlot 这些CPU可以共享所有的 TaskSlot 资源执行任务
所以类似的我们可以: 设备 对于 TaskSlot 工人 对应 CPU 并且生产设备是可以在工人之间共享, 也就是虽然内存TaskSlot进行了隔离, 但是CPU是没有进行隔离的
假设我们的生产口罩的流程分为:ABCD 四个流程 那么我们的每个设备都必须具备处理ABCD流程的能力
假设我们现在这个Flink 也具有 ABCD 四个Task。 也就是每个Task代表的都是一个处理流程。
这样工厂的架子就搭起来了, Flink集群也就是搭起来了, 现在只等数据进来,恩,等单子进来
假设现在我们有个代理商帮忙销售口罩, 每当他出售一个口罩,就会向工厂发送一个消息, 让工厂生产一个口罩并发送到指定的客户手上, 那么生产一个口罩的过程是怎么样的呢? 我们知道口罩生产是要经过ABCD四个步骤, 那么我们现在假设进行A步骤(Task)的生产: 首先选定一个 设备(TaskSlot),指定一个工人(CPU,线程), 然后开始进行生产, 这就是一个Subtask 当有很多订单过来的时候,我们就可以把车间更多的设备和工人派出去执行, 所以就会产生很多 Subtask。 当有任务执行完成 当任何一个单子完成了A步骤就会紧接着进入BCD步骤, 直到最后完成口罩的生产。
一个设备一个坑,所以生产口罩的过程, 同时进行生产是由设备决定的... 而在Flink中,这个设定就是 Flink 的并行度, 一旦并行度设置超过 设备的数量,那就会产生问题, 达不到预想的效果,所以Flink会报错。