目录
任务槽(Task Slots)
任务槽数量的设置
任务对任务槽的共享
任务槽和并行度的关系
任务槽(Task Slots)
Flink 中每一个 worker(也就是 TaskManager)都是一个 JVM 进程,它可以启动多个独立的线程,来并行执行多个子任务(subtask);
为了控制并发量,我们需要在 TaskManager 上对每个任务运行所占用的资源做出明确的划分,这就是所谓的任务槽(task slots);
每个任务槽(task slot)其实表示了TaskManager拥有计算资源的一个固定大小的子集。这些资源就是用来独立执行一个子任务的。
任务槽数量的设置
我们可以通过集群的配置文件来设定 TaskManager 的 slots 数量:
taskmanager.numberOfTaskSlots: 8
通过调整 slots 的数量,我们就可以控制子任务之间的隔离级别。需要注意的是,slots 目前仅仅用来隔离内存,不会涉及 CPU 的隔离。
任务对任务槽的共享
默认情况下,Flink 允许子任务共享 slots。如图 4-14 所示,只要属于同一个作业,那么对于不同任务节点的并行子任务,就可以放到同一个 slot 上执行。
如果希望某个算子对应的任务完全独占一个 slot,或者只有某一部分算子共享 slots,我们也可以通过设置“slot 共享组”(SlotSharingGroup)手动指定:
.map((_,1)).slotSharingGroup(“1”);
这样,只有属于同一个 slot 共享组的子任务,才会开启 slots 共享;不同组之间的任务是完全隔离的,必须分配到不同的 slots 上。
任务槽和并行度的关系
slots 和并行度确实都跟程序的并行执行有关,但两者是完全不同的概念。简单来说,task slots 是 静 态 的 概 念 , 是 指 TaskManager 具 有 的 并 发 执 行 能 力 , 可 以 通 过 参 数taskmanager.numberOfTaskSlots 进行配置;而并行度(parallelism)是动态概念,也就是TaskManager 运行程序时实际使用的并发能力,可以通过参数 parallelism.default 进行配置。