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

3200                                                       软件学报  2025  年第  36  卷第  7  期


                    Global Merge 是一种基于键值的数据交换策略, 包括本地状态存储和全局状态存储, Global Merge 不在节点
                 间交换数据, 避免     KeyBy  带来的网络传输, 基于键值的分析结果在各节点单独计算, 通过结果聚合函数最终聚合
                 到全局状态管理器上, 如图        11 基于键值的数据交换策略         (c) 所示. Global Merge 策略适用于数据对结果的修改较
                 少或结果延迟要求较宽松的场景, 当结果延迟要求宽松时, 结果的修改可以先缓存在本地进行聚合, 定期或定量地
                 与全局结果聚合, 这使得最终的聚合状态请求量远小于数据量, 从而减少网络传输. 本地状态与全局状态的聚合也
                 支持定期、定量和定点模式.
                    (3) Ahead KeyBy
                    当流式处理系统使用分布式消息队列作为数据源时, 由于这些分布式消息队列将数据划分到多个分区进行存
                 储, 划分过程可以是基于轮转、哈希或者主键的, 因此                KeyBy  操作可以被提前到消息队列上进行, 如图            11 基于键
                 值的数据交换策略       (d) 所示. 因为数据从数据源发送到消息队列的网络传输成本是固定存在的, Ahead KeyBy                    通过
                 提前在消息队列进行       KeyBy, 可以在不增加额外成本的情况下, 避免后续流式计算中使用                   KeyBy  算子进行数据交
                 换, 而一对一的算子间数据传输会发生在同一计算节点的内存上, 从而可以避免网络数据传输. Ahead KeyBy                            将数
                 据划分到不同的分区时, 与        KeyBy  算子将数据分发到不同的子任务节点上类似, 也因此可以受益于上述的负载分
                 发策略.
                    本文提出    Local Merge、Global Merge 和  Ahead KeyBy  这  3  种基于键值的数据交换策略, 适用于不同的流式
                 数据分布场景, 以供用户使用.

                 5   系统实现与整体架构

                    本工作以原生      Flink  框架为基础, 实现并扩展了上述       3  个方面的性能优化策略. 总体而言, 本文从数据流的角
                 度出发, 提出了    KeyBy  算子负载分发策略及其扩展、键级水位线机制、基于键值的数据交换策略, 与具体的处理
                 算法和计算过程解耦, 形成了一套通用的高性能流式处理优化数据流, 如图                       12 Trilink  数据流图所示; 通过对原生
                 Flink  系统架构扩展, 实现了原型系统       Trilink.


                                                          动态负载
                     Kafka                连接器             数据交换     基于键值      实时处理
                             键级别水位线                                 的交换
                                                 窗口化时
                    DataSource            Reader         动态 KeyBy            ProcessFunc
                                                  序保证
                                                 窗口化时
                    DataSource            Reader         动态 KeyBy            ProcessFunc        实时输出
                                                  序保证
                                                 窗口化时
                    DataSource            Reader         动态 KeyBy            ProcessFunc
                                                  序保证
                                                   图 12 Trilink  数据流图

                    Trilink  基于  Flink  实现, 其原型架构如图  13 Trilink  系统架构图所示, 其中的扩展部分主要包括:
                    1) 在键级水位线设计的实现中, 本文基于           Flink  提供的 KeyedProcessFunction  进一步抽象出  KeyedWatermark-
                 ProcessFunction  类, 对实时流入的  KeyedStream  进行处理, 包含窗口更新、水位线更新等关键方法.
                    2) 动态负载分发的设计实现主要包括: 位于             TaskManager 的  KeyBy  负载分发策略、数据采样、Sync 状态后
                 端、配置管理中心模块, 以及位于          JobManager 中的  KeyBy 策略协调器、数据汇总与动态负载均衡、Sync 协调器、
                 动态配置管理中心模块.
                    3) 基于键值的数据交换策略包括 Local Merge 和          Global Merge, 其中  Local Merge 通过  TaskManager 中的
                 Local Merge 算子实现, Global Merge 通过位于  TaskManager 中的本地状态和位于     JobManager 中的全局状态管理
                 器实现.
                    对于扩展的模块, 系统提供配置项和算子, 用户可以通过使用相应的算子和配置便捷地组成所需的高吞吐流
                 式处理数据流.
   274   275   276   277   278   279   280   281   282   283   284