提问者:小点点

数据流批处理vs流:窗口大小大于批处理大小


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

我们希望根据相对或绝对的时间戳分析这些数据,例如“过去1小时内有多少点击?”和“2018年2月5日下午3点到4点之间有多少点击”?

读取了窗口和触发器上的留档后,如果我们想要有一个大窗口,我们不清楚如何以数据流支持的方式将传入的数据分成批次——可能我们想要在最后一天、30天、3个月等时间内聚合。

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

同样,如果日志文件每5分钟轮换一次,当一个新文件被保存到存储桶时,我们启动数据流,同样的问题也适用——作业是停止和启动的,并且丢弃了以前作业的所有知识,还是大窗口(例如长达一个月)对新事件保持打开状态?

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

很抱歉,如果这些是基本问题,甚至一些文档的链接也会受到欢迎。


共1个答案

匿名用户

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

关于您的问题的更多评论:

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

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

因此:当按键分组时,您不需要将传入的数据划分为“键”(数据处理框架为您执行按键分组),您也不需要将其划分为窗口(框架作为每个聚合操作的一部分隐式执行按窗口分组)。

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

我希望前一点能解决这个问题,但要澄清更多:不,停止数据流作业会丢弃其所有状态。但是,您可以使用新代码“更新”作业(例如,如果您修复了bug或添加了额外的处理步骤)——在这种情况下,状态不会被丢弃,但我认为这不是您要问的。

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

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