数据流批量与流式传输:窗口大小大于批量大小

时间:2018-02-05 15:45:24

标签: google-cloud-dataflow apache-beam

我们假设我们的日志数据带有时间戳,可以流式传输到BigQuery或存储为Google存储中的文件,但不会直接流式传输到Dataflow支持的无界收集源类型。

我们希望基于时间戳分析这些数据,无论是相对还是绝对,例如"过去1小时内有多少次点击?"以及" 2018年2月5日下午3点到4点之间的点击次数和#34;?

在阅读了有关Windows和触发器的文档之后,如果我们想拥有一个大窗口,我们不清楚如何以数据流支持的方式将传入数据分成批次 - 我们可能希望聚合在最后一天,30天,3个月等。

例如,如果我们的批处理源是一个BigQuery查询,每隔5分钟运行一次,对于最后5分钟的数据,Dataflow会在作业运行之间保持打开窗口,即使数据是以5分钟的时间到达的吗?

同样,如果日志文件每5分钟轮换一次,并且我们启动Dataflow作为新文件保存到存储桶,则同样的问题适用 - 作业停止并启动,并且所有先前作业的知识都被丢弃,或者大窗口(例如长达一个月)是否对新事件保持开放状态?

我们如何在不打扰现有状态的情况下更改/修改此管道?

如果这些是基本问题,请道歉,即使是某些文档的链接也会受到赞赏。

1 个答案:

答案 0 :(得分:4)

听起来您希望对数据进行任意交互式聚合查询。 Beam / Dataflow本身并不适合,但Dataflow最常见的用例之一是将数据摄取到BigQuery中(例如从GCS文件或Pubsub中),其中 非常非常适合。

关于你的问题的一些评论:

  

我们不清楚如何将我们的传入数据分成批次

在梁中加窗只是一种在时间维度中指定聚合范围的方法。例如。如果您每5分钟使用15分钟大小的滑动窗口,那么事件时间戳为14:03的记录将计入三个窗口中的聚合:13:50..14:05,13:55 .. 14:10,14:00..14:15。

所以:就像你不需要将输入的数据分成"键"当按键分组时(数据处理框架为你执行逐个键),你不要将它分成窗口(框架作为每个聚合操作的一部分隐式执行逐个窗口)。

  

Dataflow会在作业运行之间保持窗口打开

我希望前一点能解决这个问题,但要澄清更多:否。停止Dataflow作业会丢弃其所有状态。但是,您可以更新&#34;使用新代码的工作(例如,如果您已经修复了错误或添加了额外的处理步骤) - 在这种情况下,状态不会被丢弃,但我认为这不是您要求的。< / p>

  

如果日志文件每隔5分钟轮换一次,我们就会在保存新文件时启动Dataflow

听起来你想连续摄取数据。这样做的方法是编写一个连续运行的流式管道,连续摄取数据,而不是每次新数据到达时启动新的管道。如果文件到达存储桶,如果您正在阅读文本文件,则可以使用TextIO.read().watchForNewFiles(),如果您正在阅读其他类型的文件,则可以使用其各种类似文件(最常见的是{{{ 1}})。