Dataflow 支持两种流处理作业模式:
- “正好一次”模式。此模式是所有 Dataflow 流处理作业的默认模式。在此模式下,Dataflow 可确保在数据通过流水线时,系统不会删除或重复记录。
- “至少一次”模式。此模式可保证记录至少被处理一次(即不会丢失任何输入记录)。但是,此模式下可能存在重复记录。对于可以容忍重复项的应用场景,“至少一次”模式可以显著降低作业的费用和延迟时间。
选择要使用的流处理模式
如果您需要确保流水线结果准确和语义可预测,请选择“正好一次”模式。例如:
- 包含聚合(例如计数、求和或求平均)的流水线。
- 依赖于处理一次且仅处理一次的记录的业务关键型用例。例如欺诈检测、网络威胁检测和电子商务库存信息中心。
如果您的工作负载可以容忍重复记录并且可能会受益于降低的费用或缩短的延迟时间,请选择“至少一次”流处理模式。例如:
- 在 Dataflow 下游执行重复信息删除的工作负载。例如,写入 BigQuery 或 SQL 数据存储区的流水线。
- 不包含聚合的仅限映射流水线。例如日志处理、变更数据捕获或提取、转换和加载 (ETL) 作业,其中流水线仅执行按元素转换,例如架构转换。
- 输出接收器无法保证“正好一次”传送的流水线,例如 Pub/Sub。在这种情况下,您可能无需在流水线中执行重复信息删除操作,便可以从“至少一次”流处理模式的降低费用和延迟时间中受益。
- 从 Pub/Sub 读取数据的流水线。使用“至少一次”模式时,从 Pub/Sub 读取数据会得到显著优化。
其他注意事项
“至少一次”模式可以显著降低流水线的费用和延迟时间。确切的影响取决于流水线的具体情况。在实际负载下测试“至少一次”流处理以评估影响。
使用“至少一次”模式时,重复记录率取决于重试次数。基准率通常较低 (<1%)。但是,如果工作器节点发生故障或其他条件导致重复的 RPC 调用,则可能会出现峰值。
流处理模式会影响 Streaming Engine 处理记录的方式,但不会更改 I/O 连接器的语义。建议您将 I/O 语义与流处理模式保持一致。例如,如果您将“至少一次”流处理模式与 BigQuery I/O 连接器搭配使用,请将写入模式设置为
STORAGE_API_AT_LEAST_ONCE
。使用“至少一次”流处理时,Google 提供的 Dataflow 模板会自动启用此选项。逐元素转换(例如
Map
)并不总是幂等的。例如,一个接收消息并将当前时间戳附加到消息的函数。在这种情况下,重复记录可能会产生多个不同的输出。“至少一次”模式可能不适用于该流水线。
设置流处理模式
“正好一次”处理是所有 Dataflow 作业的默认设置。如需启用“至少一次”流处理模式,请设置 streaming_mode_at_least_once
服务选项。
Java
--dataflowServiceOptions=streaming_mode_at_least_once
Python
--dataflow_service_options=streaming_mode_at_least_once
Go
--dataflow_service_options=streaming_mode_at_least_once
如果您未指定 streaming_mode_at_least_once
选项,则 Dataflow 会使用“正好一次”流处理模式。
如果您设置了 streaming_mode_at_least_once
选项,Dataflow 会自动启用 Streaming Engine 并按资源结算。
如需更新正在运行的作业的流处理模式,请停止现有作业并运行替换作业。如需了解详情,请参阅启动替换作业。
选择模板的流处理模式
如需在运行 Dataflow 流处理模板时选择流处理模式,请执行以下步骤:
控制台
在 Google Cloud 控制台中,前往 Dataflow 作业页面。
点击基于模板创建作业。
从 Dataflow 模板下拉菜单中,选择要运行的模板。
在流处理模式部分中,选择流处理模式。如果模板仅支持一种模式,则此选项处于停用状态。
gcloud
如需启用“至少一次”模式,请在 additional-experiments
标志中设置 streaming_mode_at_least_once
选项:
--additional-experiments=streaming_mode_at_least_once
如需启用“正好一次”模式,请在 additional-experiments
标志中设置 streaming_mode_exactly_once
选项:
--additional-experiments=streaming_mode_exactly_once
这两个选项是互斥的。 如果您未设置其中任一选项,则模板会默认采用由模板元数据确定的流处理模式。如需了解详情,请参阅自定义模板。
REST
使用 FlexTemplateRuntimeEnvironment
(Flex 模板)或 RuntimeEnvironment
(经典模板)对象中的 additionalExperiments
字段。
{
additionalExperiments : ["streaming_mode_at_least_once"]
...
}
自定义模板
如果您创建支持“至少一次”处理的自定义模板,请将以下顶级字段添加到模板元数据文件中:
{
"streaming": true,
"supportsAtLeastOnce": true,
"supportsExactlyOnce": true,
"defaultStreamingMode": "AT_LEAST_ONCE"
}
这些元数据字段使用户在 Google Cloud 控制台中部署模板时可以选择流处理模式。 defaultStreamingMode
字段是可选字段,用于指定模板的默认流处理模式。如果您未指定 defaultStreamingModeg
,并且模板支持这两种模式,则默认采用“正好一次”模式。
如需了解详情,请参阅 Dataflow 模板文档中的以下部分:
- Flex 模板:元数据
- 经典模板:在流水线代码中使用元数据
查看作业的流处理模式
如需查看作业的流处理模式,请转到 Google Cloud 控制台中的作业页面。
“作业详情”页面的作业信息面板中也会列出流处理模式。
限制
“至少一次”流处理模式要求使用 Streaming Engine 并按资源结算。
价格
“至少一次”模式始终采用按资源结算方式,即为作业消耗的总资源付费。
无论流处理模式如何,Streaming Engine 计算单元的每单位费用都相同。但是,在大多数情况下,使用“至少一次”模式时,流水线消耗的总资源要少得多。
后续步骤
- 详细了解“正好一次”处理。