Page 278 - 《软件学报》2025年第7期
P. 278

秦政 等: 面向  Apache Flink  流式分析应用的高吞吐优化技术                                          3199


                 KeyBy  的全量数据传输, 以提高吞吐率和降低传输延迟.
                    (1) Local Merge
                    Flink  的编程模型在   MapReduce 编程模型上进行扩展, 也通过并行执行算子任务支持任务并行, 且支持更多
                 样化的算子. 其    KeyBy  算子类似于    MapReduce  中的  Shuffle  阶段, 但不支持  Combine  函数进行本地数据聚合.
                 Flink  仅在  Flink SQL  中支持  Local-Global Aggregation [47] , 其目标是解决数据倾斜问题, 不适用于事件驱动型流式
                 分析应用. 流式处理中, 由于数据具有时序信息, 不能简单地进行聚合. 本文提出                      Local Merge 算子, 支持时序感知
                 的本地数据聚合, 从而减少        KeyBy  时的网络传输数据量.
                    Local Merge 算子将事件划分到不同的时间槽中分别聚合, 聚合后事件的时间戳被设置为所有事件的最大值,
                 以向后传递正确的水位线, 如图          11 基于键值的数据交换策略         (b) 所示. Local Merge 算子在向后发射数据时, 会按
                 时间槽向后顺序依次发送, 保持数据有序. Local Merge 算子支持定期、定量和定点的数据发射模式, 定期模式在
                 最早被聚合数据到达指定延迟时发射, 适合要求低处理延迟场景; 定量模式在聚合指定数量的数据后发射, 适合要
                 求高吞吐率场景; 定点模式识别到特定事件时发射, 可以在定期和定量模式基础上, 用于检测到窗口边界后发射数
                 据, 降低结果的产生延迟; 如表        7 Local Merge 模式触发条件及适用场景所示.



                                  (a) KeyBy         KeyBy





                                  (b) Local Merge




                                                                    Global
                                  (c) Global Merge
                                                                    state




                                  (d) Ahead KeyBy


                                                图 11 基于键值的数据交换策略


                                           表 7 Local Merge 模式触发条件及适用场景

                                 模式                   触发条件                      适用场景
                                 定期                  到达指定延迟                      低延迟
                                 定量                聚合指定数量数据                      高吞吐
                                 定点                数据满足定点条件                  检测窗口边界等

                    (2) Global Merge
                    在低电压检测应用场景中, 大部分实时电压数据属于正常电压, 不会修改当前全局电压状态, 仅需要进行本地
                 聚合. 这类计算任务在异常监管等场景中较为普遍, 大量局部计算并不会修改全局状态. 因此在各节点单独计算,
                 将部分结果存储在本地状态中, 并将状态变更聚合到全局状态中能有效节约通信成本. 全局状态可以使用如键值
                 存储  Redis、关系型存储    MySQL [48] 等实现.
   273   274   275   276   277   278   279   280   281   282   283