这篇文章主要是想介绍在deploy到Taskmanager
前,Slotsharing
机制是如何将不同Task
的Subtask
复用同一个Slot,更加充分地利用Flink集群资源。学习的Flink代码版本是1.9.2。
相关概念
-
SlotSharingGroup
: 将不同的的Task放在相同的Slot
的分组,默认是default,只有一个分组,也就是Flink会尽量将不同Task的Subtask放在到一个Slot里面。 -
CoLocationGroup
: 不同Task的相同Subtask放在相同Slot
的约束。如 process0 和sink0,process1和sink1分别放在一起。可以通过Flink API 中的Transformation 方法设置
public abstract class Transformation<T> { public void setSlotSharingGroup(String slotSharingGroup) { this.slotSharingGroup = slotSharingGroup; } public void setCoLocationGroupKey(@Nullable String coLocationGroupKey) { this.coLocationGroupKey = coLocationGroupKey; } }
实现
1.相关类:
SlotSharingManager
: 负责SlotSharing
的关键类,同一个作业相同SlotSharingGroup
的Execution
申请资源会共用同一个SlotSharingManager
。SlotSharingManager
维护多棵TaskSlot
树,其中TaskSlot
并不是真实TaskManager中的Slot,只是用来描述多个Task复用Slot的抽象实现。后面会详细说一下。
//尚未占用到真实Slot的TaskSlot树的根节点
private final Map<SlotRequestId, MultiTaskSlot> unresolvedRootSlots;
//已占用到真实Slot的TaskSlot树的根节点
private final Map<TaskManagerLocation, Map<AllocationID, MultiTaskSlot>> resolvedRootSlots;
-
TaskSlot
: 节点实现类, 上文提到的树节点,共有两个实现类-
MultiTaskSlot
:一般是树的根节点,还有可能是中间节点(设置了CoLocationGroup
),是PhyscialSlot.PayLoad
接口的实现类,如果是根节点,会占用一个PhysicalSlot
,这棵叶子节点会共享根节点的PhysicalSlot
。//子节点 private final Map<AbstractID, TaskSlot> children; // 父节点 @Nullable private final MultiTaskSlot parent; // 被分配的Slot,如果被分配完成(future是完成状态),那么这个根节点就会被标记成resolved private final CompletableFuture<? extends SlotContext></
-