流处理流水线

无界限 PCollection (或称无界限集合),表示流处理流水线中的数据。无界限集合包含来自不断更新的数据源的数据,例如 Pub/Sub

您不能只使用键来对无界限集合中的元素进行分组。由于数据源不断添加新元素,流式数据中给定键的元素可能会有无限多个。您可以使用窗口水印触发器来汇总无界限集合中的元素。

窗口的概念也适用于有界限 PCollection,它采用批量流水线表示数据。如需了解批处理流水线中的窗口函数,请参阅使用有界限 PCollection 的窗口函数的 Apache Beam 文档。

窗口和窗口函数

窗口函数将无界限集合划分为逻辑组件或窗口。窗口函数按各个元素的时间戳对无界限集合进行分组。每个窗口包含有限数量的元素。

您可以使用 Apache Beam SDKDataflow SQL 流式处理扩展程序设置以下窗口:

翻滚窗口

翻滚窗口表示数据流中的一段一致且不相交的时间间隔。

例如,如果设置三十秒的翻滚窗口,则时间戳值为 [0:00:00-0:00:30) 的元素位于第一个窗口中。时间戳值为 [0:00:30-0:01:00) 的元素位于第二个窗口中。

下图说明了如何将元素划分为三十秒的翻滚窗口。

显示窗口时长为 30 秒的翻滚窗口的图像

跳跃窗口

跳跃窗口表示数据流中的一段一致时间间隔。跳跃窗口可以重叠,而翻滚窗户是不相交的。

例如,跳跃窗口可以每 30 秒钟启动一次,并捕获 1 分钟的数据和窗口。跳跃窗口的启动频率被称为周期。此示例中窗口的时长为一分钟,周期为三十秒。

下图说明了如何将元素划分为周期为三十秒,时长为一分钟的跳跃窗口。

显示窗口时长为 1 分钟,窗口周期为 30 秒的跳跃窗口的图像

如需获取数据的运行平均值,请使用跳跃窗口。您可以使用时长为一分钟,周期为三十秒的跳跃窗口来每三十秒计算一次一分钟的运行平均值。

会话窗口

会话窗口包含另一元素的间隔时长内的元素。间隔时长是数据流中新数据之间的间隔。如果数据在间隔时长之后到达,则数据将被分配给新窗口。

例如,会话窗口可以划分表示用户鼠标活动的数据流。此数据流可能包含较长的空闲时间,中间散布着许多点击。会话窗口可以包含由点击产生的数据。

会话数据选取会为每个数据键分配不同的窗口。翻滚窗口和跳跃窗口包含指定时间间隔内的所有元素,与数据键无关。

下图直观呈现了将元素划分为会话窗口的方式。

显示具有最小间隔时长的会话窗口的图像

水印

水印是一个阈值,它表明了 Dataflow 预计一个窗口中的所有数据何时到达。如果到达的新数据的时间戳在窗口中但早于水印,则该数据被视为迟到数据

Dataflow 出于以下原因跟踪水印:

  • 无法保证数据会按时间顺序或以可预测的时间间隔到达。
  • 无法保证数据事件会按照它们生成的顺序出现在流水线中。

数据源会确定水印。您可以通过 Apache Beam SDK 来允许出现迟到数据。Dataflow SQL 不会处理迟到数据。

触发器

触发器确定在数据到达时发送聚合结果的时间。默认情况下,结果会在水印超过窗口末尾后发出。

您可以使用 Apache Beam SDK 为流式处理流水线中的每个集合创建或修改触发器。您无法使用 Dataflow SQL 设置触发器。

Apache Beam SDK 可以设置针对以下条件的任意组合执行的触发器

  • 事件时间,由每个数据元素的时间戳指示。
  • 处理时间,即数据元素在流水线任意给定阶段处理的时间。
  • 集合中数据元素的数量。