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  算子时, 采样线程根据配置的采样率对数据随机采样, 计算后自动化配置最优负载分发策略.
                    更高的采样率意味着对数据流更准确地反映, 但也可能导致更多的计算代价. 在流式处理应用刚启动时, 系统
   271   272   273   274   275   276   277   278   279   280   281