Page 271 - 《软件学报》2025年第7期
P. 271
3192 软件学报 2025 年第 36 卷第 7 期
境中 CPU 核数为 60, 因而将 Flink 并行度默认设置为 60.
3.2 数据乱序耦合
流式处理系统往往采取一定的水位线机制以提高计算准确性. 本工作首先介绍 Flink 的水位线机制, 再通过一
个简单的工业传感器案例展示 Flink 水位线机制造成的额外数据耦合; 之后, 通过对现有 Flink 系统进行测试, 观
察不同水位线大小造成的数据乱序程度及吞吐率下降程度.
Flink 采用水位线机制表示最大可容忍的事件延迟 [41] , 水位线是每个算子子任务上的逻辑时钟, 用于触发定时
事件的计算. 水位线在靠近数据源侧产生, 在各个算子上依次向后传递, 对于多输入算子, 例如 KeyBy, 会选择所有
通道中的最小水位线. Flink 上的水位线是子任务级的, 每个算子的子任务上都有唯一的水位线. 当使用 Apache
Kafka 作为数据源时, 每个 Kafka 分区可能有一个简单的事件时间模式, 例如时间戳单调递增. 然而, 多个分区被并
行消费时, 来自这些分区的事件发生耦合, 破坏了分区内的相对有序.
例如, 当输入数据来源于工业传感器数据时, 各个传感器产生的数据在消息队列内往往各自局部有序 [42] , 然
而由于传感器部署位置导致的网络延迟差异, 不同传感器产生的事件到达消息队列时不能保证事件时间具有严格
递增关系 [43] . 例如, 传感器 A 在 T=3 s 产生的事件到达消息队列的时间, 可能晚于传感器 B 在 T=4 s 产生的事件,
也因此在队列中更位于尾部, 造成了事实上的乱序耦合. 另一方面, 如果传感器存在本地时钟偏差, 例如传感器 C
的本地时钟比传感器 D 早 10 s, 可能导致更严重的数据流乱序.
Flink 提供了子任务级有界水位线机制, 允许正确处理乱序程度不超过最大乱序边界的流式数据, 然而, 当边
界值设置较大时, 即数据将额外等待较大时间时, 可以有效降低数据乱序程度, 但会造成系统输出时延提高, 系统
整体吞吐率下降. 另一方面, 当边界值设置较低时, 即数据等待较少时间, 那么潜在的数据乱序现象将会提高, 为保
证结果正确性, 结果需要进行重计算并更新, 系统吞吐率同样会下降.
本文通过实验分析了子任务级水位线边界设置对系统吞吐率和乱序程度造成的影响. 实验设置 3 个数据源,
其中一个数据源本地时钟存在 4 s 的偏差, 实验分别测试了边界值为 0 s, 1 s, 2 s, 4 s 时的系统性能, 结果如图 6 水
位线边界设置乱序性能影响所示. 实验结果表明, 边界值的增加确实可以有效减少乱序数据比例, 但这意味着更长
的等待时间, 带来了额外的时延. 另一方面, 当边界值过大时, 即使乱序比例为 0, 系统吞吐率也会受到显著下降,
甚至造成堵塞. 在现实场景中, 本地时钟偏差和网络通信都具有随机性和不可知性, 因此, 系统性能会因为实时数
据的质量产生巨大波动. 在目前的典型流式分析应用中, 大多数场景下不同数据来源间的直接聚合分析较少, 全量
数据来源间的聚合更少, 当前的水位线机制粒度过大, 造成了系统额外的时序耦合, 带来了性能瓶颈.
0.7
乱序数据比例
0.6 吞吐率提升
0.5
0.4
比例 0.3
0.2
0.1
0
0 1 2 4
边界值大小
图 6 水位线边界设置乱序性能影响
3.3 节点负载不均
分布式流式处理系统需要将任务负载分发到多个计算节点上并行处理. 负载不均衡问题会造成系统吞吐率的
下降和轻负载节点上的资源得不到充分利用. 本节通过实验测试论证了现有典型流式系统 Flink 在进行实时计算
时, KeyBy 算子确实存在负载分配不均衡的现象.

