Page 276 - 《软件学报》2025年第7期
P. 276
秦政 等: 面向 Apache Flink 流式分析应用的高吞吐优化技术 3197
心. 当 Flink 集群不同节点的 CPU 配置不同, 导致单 CPU 核心性能存在差异时, 即使不同节点的负载分布均衡, 也
会因为单核心性能差异导致吞吐率的差异, 单核心性能孱弱的节点会成为系统的吞吐率瓶颈. 本文提出带权重的
负载分发策略, 允许为每个节点定义不同的负载权重, 从而在 Task Slot 间存在性能差异时, 保证节点性能感知的
负载均衡, 该场景下的负载均衡度需要以节点性能进行加权计算.
各 Task Slot 按权重将 [0, 100) 划分为多个连续子区间, 本文支持以 Key 的哈希值和随机数计算落点. 当 Key
均匀分布时, 本地基于哈希计算落点, 从而选择目标算子子任务即可, 当 Key 不均匀分布时, 需要由特定的协调者
基于随机数进行计算, 保证负载的均衡.
Weight 分发策略的实现如算法 2 所示, 使用哈希的 Weight 策略只需在本地计算, 使用随机数的 Weight 策略
在协调器上执行. 在 Weight 分发策略中, 对于节点数量较少的集群, 朴素的遍历足以满足性能, 当集群节点数量较
多时, 本文通过将 WeightTable 预处理为累计和, 例如{20, 50, 30}的 WeightTable 会被预处理为{20, 70, 100}, 从而
可以采用二分查找代替第 4–6 行以实现对数时间复杂度的落点计算.
算法 2. Weight 分发策略.
Function: Weight(Key, WeightTable)
Input: Key: Field used in KeyBy of data, WeightTable: Weight of nodes, sum of weights should equal 100;
Output: Target node.
1. if Key is contained in History Assignment Map then
2. return assigned node
3. Initiate R as a random number in [0, 100), N as node0
4. while (R >= WeightTable[N]) do
5. R = R – WeightTable[N]
6. N = next node
7. Assign N to Key in History Map
8. return node N
综上, 表 5 分发策略及适用场景总结了包括本文提出的 4 种分发策略在内的负载分发策略及其所适用的场
景. 由于实时数据流具有随机性, 相较于传统的数据倾斜问题, KeyBy 算子负载分发更关注于数据流的实时分布特
性以及历史状态信息. 为了应对动态变化的流数据, 在第 4.2.2 节和第 4.2.3 节中, 本文进一步提出了基于在线监测
的负载均衡策略动态配置和基于 ABS 算法的无中断键值状态交换.
表 5 分发策略及适用场景
分发策略 分配映射方式 本地计算 适用场景
Hash 基于哈希函数与键值组 是 Key不均匀分布, 数据不均匀分布, 节点性能不明
Modulo 对并行度取模 是 Key为整数、Key均匀分布、数据均匀分布
LeastKey 根据已分配Key的数量计算 否 数据均匀分布
LeastCount 根据已完成的历史数据量计算 否 数据不均匀分布
Weight 根据节点权重分配 取决于配置 节点间硬件配置不同
4.2.2 基于在线监测的负载均衡策略动态配置
为了衡量比较不同分配策略的优劣, 需要在线检测不同策略的负载均衡度, 本文通过对 KeyBy 算子进行扩展,
支持按可配置的数据采样率, 对流式数据进行采样后, 计算在所有支持的分发策略下的负载均衡度. 数据流经
KeyBy 算子时, 采样线程根据配置的采样率对数据随机采样, 计算后自动化配置最优负载分发策略.
更高的采样率意味着对数据流更准确地反映, 但也可能导致更多的计算代价. 在流式处理应用刚启动时, 系统

