无界限 PCollection (或称无界限集合),表示流处理流水线中的数据。无界限集合包含来自不断更新的数据源的数据,例如 Pub/Sub。
您不能只使用键来对无界限集合中的元素进行分组。由于数据源不断添加新元素,流式数据中给定键的元素可能会有无限多个。您可以使用窗口、水印和触发器来汇总无界限集合中的元素。
窗口和窗口函数
窗口函数将无界限集合划分为逻辑组件或窗口。窗口函数按各个元素的时间戳对无界限集合进行分组。每个窗口包含有限数量的元素。
您可以使用 Apache Beam SDK 或 Dataflow SQL 流式处理扩展程序设置以下窗口:
翻滚窗口
翻滚窗口表示数据流中的一段一致且不相交的时间间隔。
例如,如果设置三十秒的翻滚窗口,则时间戳值为 [0:00:00-0:00:30) 的元素位于第一个窗口中。时间戳值为 [0:00:30-0:01:00) 的元素位于第二个窗口中。
下图说明了如何将元素划分为三十秒的翻滚窗口。
跳跃窗口
跳跃窗口表示数据流中的一段一致时间间隔。跳跃窗口可以重叠,而翻滚窗户是不相交的。
例如,跳跃窗口可以每 10 秒钟启动一次,并捕获 1 分钟的数据和窗口。跳跃窗口的启动频率被称为周期。此示例中窗口的时长为一分钟,周期为三十秒。
下图说明了如何将元素划分为周期为三十秒,时长为一分钟的跳跃窗口。
如需获取数据的运行平均值,请使用跳跃窗口。您可以使用时长为一分钟,周期为三十秒的跳跃窗口来每三十秒计算一次一分钟的运行平均值。
会话窗口
会话窗口包含另一元素的间隔时长内的元素。间隔时长是数据流中新数据之间的间隔。如果数据在间隔时长之后到达,则数据将被分配给新窗口。
例如,会话窗口可以划分表示用户鼠标活动的数据流。此数据流可能包含较长的空闲时间,中间散布着许多点击。会话窗口可以包含由点击产生的数据。
会话数据选取会为每个数据键分配不同的窗口。翻滚窗口和跳跃窗口包含指定时间间隔内的所有元素,与数据键无关。
下图直观呈现了将元素划分为会话窗口的方式。
水印
水印是一个阈值,它表明了 Dataflow 预计一个窗口中的所有数据何时到达。如果到达的新数据的时间戳在窗口中但早于水印,则该数据被视为迟到数据。
Dataflow 出于以下原因跟踪水印:
- 无法保证数据会按时间顺序或以可预测的时间间隔到达。
- 无法保证数据事件会按照它们生成的顺序出现在流水线中。
数据源会确定水印。您可以通过 Apache Beam SDK 来允许出现迟到数据。Dataflow SQL 不会处理迟到数据。
触发器
触发器确定在数据到达时发送聚合结果的时间。默认情况下,结果会在水印超过窗口末尾后发出。
您可以使用 Apache Beam SDK 为流式处理流水线中的每个集合创建或修改触发器。您无法使用 Dataflow SQL 设置触发器。
Apache Beam SDK 可以设置针对以下条件的任意组合执行的触发器:
- 事件时间,由每个数据元素的时间戳指示。
- 处理时间,即数据元素在流水线任意给定阶段处理的时间。
- 集合中数据元素的数量。