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 中的全局状态管理
器实现.
对于扩展的模块, 系统提供配置项和算子, 用户可以通过使用相应的算子和配置便捷地组成所需的高吞吐流
式处理数据流.

