无界限 PCollections (或称无界限集合),表示流处理流水线中的数据。无界限集合包含来自不断更新的数据源的数据,例如 Pub/Sub。
您不能只使用键来对无界限集合中的元素进行分组。由于数据源不断添加新元素,流式数据中给定键的元素可能会有无限多个。您可以使用窗口、水印和触发器来汇总无界限集合中的元素。
窗口的概念也适用于有界限 PCollection,它采用批量流水线表示数据。如需了解批处理流水线中的窗口函数,请参阅使用有界限 PCollection 的窗口函数的 Apache Beam 文档。
如果 Dataflow 流水线具有有界限数据源(即该来源不包含持续更新的数据),并且在该有界限来源被完全耗用后通过 --streaming
标志将流水线切换到流式模式,则流水线会停止运行。
使用流式处理模式
如需在流式处理模式下运行流水线,请在运行流水线时在命令行中设置 --streaming
标志。您还可以在构建流水线时以编程方式设置流式模式。
流式模式不支持批量来源。
使用较大的工作器池更新流水线时,流式作业可能无法按预期进行纵向扩容。对于不使用 Streaming Engine 的流式作业,扩容后的资源量不能超出原始作业开始时分配的原始工作器数量以及永久性磁盘资源量。您在更新 Dataflow 作业并在新作业中指定数量更多的工作器时,只能指定与您为原始作业指定的工作器数量上限相等的工作器数量。
使用以下标志指定工作器数量上限:
Java
--maxNumWorkers
Python
--max_num_workers
Go
--max_num_workers
窗口和窗口函数
窗口函数将无界限集合划分为逻辑组件或窗口。窗口函数按各个元素的时间戳对无界限集合进行分组。每个窗口包含有限数量的元素。
您可以使用 Apache Beam SDK 设置以下窗口:
翻滚窗口
翻滚窗口表示数据流中的一段一致且不相交的时间间隔。
例如,如果设置三十秒的翻滚窗口,则时间戳值为 [0:00:00-0:00:30) 的元素位于第一个窗口中。时间戳值为 [0:00:30-0:01:00) 的元素位于第二个窗口中。
下图说明了如何将元素划分为三十秒的翻滚窗口。
跳跃窗口
跳跃窗口表示数据流中的一段一致时间间隔。跳跃窗口可以重叠,而翻滚窗户是不相交的。
例如,跳跃窗口可以每 30 秒启动一次,并捕获 1 分钟的数据。跳跃窗口的启动频率被称为周期。此示例中窗口的时长为一分钟,周期为三十秒。
下图说明了如何将元素划分为周期为三十秒,时长为一分钟的跳跃窗口。
如需获取数据的运行平均值,请使用跳跃窗口。您可以使用时长为一分钟,周期为三十秒的跳跃窗口来每三十秒计算一次一分钟的运行平均值。
会话窗口
会话窗口包含另一元素的间隔时长内的元素。间隔时长是数据流中新数据之间的间隔。如果数据在间隔时长之后到达,则数据将被分配给新窗口。
例如,会话窗口可以划分表示用户鼠标活动的数据流。此数据流可能包含较长的空闲时间,中间散布着许多点击。会话窗口可以包含由点击产生的数据。
会话数据选取会为每个数据键分配不同的窗口。翻滚窗口和跳跃窗口包含指定时间间隔内的所有元素,与数据键无关。
下图直观呈现了将元素划分为会话窗口的方式。
水印
水印是一个阈值,它表明了 Dataflow 预计一个窗口中的所有数据何时到达。如果水印已经过窗口的末尾,并且新数据在窗口中到达时带有时间戳,则数据为延迟数据。如需了解详情,请参阅 Apache Beam 文档中的水印和延迟数据部分。
Dataflow 出于以下原因跟踪水印:
- 无法保证数据会按时间顺序或以可预测的时间间隔到达。
- 无法保证数据事件会按照它们生成的顺序出现在流水线中。
数据源会确定水印。您可以通过 Apache Beam SDK 来允许出现延迟数据。
触发器
触发器确定在数据到达时发送聚合结果的时间。默认情况下,结果会在水印超过窗口末尾后发出。
您可以使用 Apache Beam SDK 为流式处理流水线中的每个集合创建或修改触发器。
Apache Beam SDK 可以设置针对以下条件的任意组合执行的触发器:
- 事件时间,由每个数据元素的时间戳指示。
- 处理时间,即数据元素在流水线任意给定阶段处理的时间。
- 集合中数据元素的数量。
后续步骤
- 流式传输 101:批处理之外的世界(博文)
- 流式处理 102:批处理之外的世界(博文)