[英]Apache Beam: What trigger do I need for my use case
我正在编写一个 Google Dataflow 作业,它从 Pub/Sub 主题读取 JSON,类似于以下内容。
{
"viewing_id": 1000,
"viewing_created_at": "2022-12-01 14:30:00 UTC"
}
在转换过程中,我设置了 window 时间戳如下。 在 JSON 读取步骤中,我的元素将时间戳设置为来自 viewing_created_at 日期时间的 unix 时间戳 int。
| 'Timestamp' >> beam.Map(lambda viewing: beam.window.TimestampedValue(viewing, viewing.timestamp))
以上所有方法都有效,但我不确定要为我的用例设置窗口,而且我发现文档有点难以理解。 https://beam.apache.org/documentation/programming-guide/#event-time-triggers
我想在 window 结束后触发结果的发出,再加上 5 分钟的延迟。 发布到主题的脚本在创建查看后立即触发,因此发布和数据流读取之间可能会有几秒钟的延迟。 所以我想等5分钟再处理数据。 我不关心之后发生的任何事情。
这是我到目前为止...
| beam.WindowInto(
window.FixedWindows(15),
trigger = AfterWatermark(),
allowed_lateness = 0,
accumulation_mode = AccumulationMode.DISCARDING
)
我阅读了AfterWatermark.pastEndOfWindow
但不确定如何实现它也不知道如何设置延迟。
需要明确的是,我只想每 window 触发一次。我想等待一定时间并汇总到目前为止收集的结果,而忽略其他任何内容。
需要明确的是,我只想每 window 触发一次。我想等待一定时间并汇总到目前为止收集的结果,而忽略其他任何内容。
以下代码适用于固定 window 的 15 分钟,延迟数据允许在 window 结束后最多 5 分钟。
对于早期和准时数据,每 window 触发一次,对于任何晚期数据,在水印之后,事件计数为 1 时触发。
任何超过 5 分钟的延迟地平线都将被丢弃。
| "WindowBy15Minutes" >> beam.WindowInto(beam.window.FixedWindows(60*15), # 15 minutes
trigger=Repeatedly(AfterWatermark(late=AfterCount(1))),
allowed_lateness=(60*5), # 5 minutes
accumulation_mode=AccumulationMode.DISCARDING)
编辑:
默认触发行为是,当水印已经超过 Window 的末尾时,它会触发一次。在这种情况下,迟到的数据会被简单地丢弃。
trigger=Repeatedly(AfterWatermark())
为了处理延迟数据,我们引入了延迟范围,它是使用allowed_lateness
定义的。 在您的情况下,允许延迟数据最多 5 分钟 - 这意味着,在水印超过 window 的末尾之后,每个 window 打开 5 分钟。
trigger=Repeatedly(AfterWatermark(late=AfterCount(1))),
allowed_lateness=(60*5))
我们添加了AfterCount(1)
以在接收到一些数据后立即获得推测结果,而无需等待整个 window 时间,您也可以指定处理时间,如AfterProcessingTime()
,您可以跳过它,因为您需要每 Window 一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.