2.3.8 版本及以前版本,会从所有节点中随机选择节点来运行任务。每个任务需要的slot=2+N(并行度)。默认情况下slot为动态不限制个数(也可以设置为固定值)。 官方计划添加2种slot分配机制 ([[Feature][Core] Add slot allocation strategy · Issue #8205 · apache/seatunnel](https://github.com/apache/seatunnel/issues/8205)): + SLOT_RATIO : 通过计算slot使用率=(总槽数-未分配的槽数)/总槽数 + SYSTEM_LOAD : ![[Pasted image 20250206161739.png]] 翻译如下: 1. 时间权重设计 时间权重反映了时间因素对调度优先级的影响: * 最近的数据被赋予更高的权重,而历史数据逐渐衰减。 * 使用4,2,2,2,1,1的分布来归一化每个数据点的时间权重计算如下: 时间权重比=当前权重/10 对于启动时少于5个数据点的集群,将单独应用规范化,并根据需要进行动态调整。 2. 资源利用率计算 CPU和内存利用率与加权评估相结合,以获得整体资源空闲率: 资源空闲率=(1-CPU利用率)*CPU权重+(1-内存利用率)*内存权重 (1 - CPU Utilization) 和 (1 - Memory Utilization) 代表空闲率。 CPU和内存权重根据特定需求可调(例如,0.6和0.4)以适应各种场景。 1. 时间衰减和调度优先级公式 考虑到时间权重的衰减,调度优先级的公式是: 总体资源空闲率=\sum_{i=1}^{5}((1-CPU利用率_i)*CPU权重+(1-内存利用率_i)*内存权重)*时间权重_i)/(CPU权重+内存权重) 2. 动态调整槽分配的资源空闲率 在分配多个槽时,考虑实时更新和资源状态的动态模拟(因为资源消耗不会在槽分配后立即改变): 每槽资源使用比率=(1-总资源空闲率)*已分配槽的数量 在槽分配之后,对应节点的空闲率会更新: 后槽分配空闲率=总资源空闲率-每槽资源使用比率 默认情况下,假设单个槽消耗10%的资源。这种假设可以防止在初始部署期间由于缺乏精确的使用数据而导致单个节点过度分配资源。随后的监控将细化这些估计。 这种方法确保了调度更准确地反映实际资源使用情况。 3. 引入平衡因子 仅基于槽分配的动态调整可能会引入不准确性。为了衡量节点的当前负载并防止资源过于集中,引入了一个基于槽数量的平衡因子: 平衡因子_i=1-S_used,i/S_total,i S_used,i: 已分配给节点 i 的槽数量 S_total,i: 节点 i 上的总槽数量 调度优先级通过平衡因子进行调整: W_i = α·Post-Slot Allocation Idle Rate_i + β·BalanceFactor_i 参数解释: α: 强调资源利用率的权重(例如,0.7)。 β: 用于防止单个节点过载的平衡因子的权重(例如,0.3)。 4. 动态调整逻辑 定期收集CPU和内存利用率,维护最新的5个数据点。 动态更新同一任务的权重,逐步降低较旧数据的权重。 根据槽使用情况动态调整。 示例: 假设有两个节点需要10个槽: * 节点A有10个空闲槽。 * 节点B有20个空闲槽。 根据第4步和第5步的计算,如果节点A始终比节点B具有更高的权重,那么仍然应该将资源分配给节点A。这个结果可能表明集群配置不佳(例如,工作者节点上的槽不足)。