【问题标题】:Dynamically define the size of the apache beam windows动态定义 apache 光束窗口的大小
【发布时间】:2020-08-11 09:31:16
【问题描述】:

我正在从 PubSub 读取事件,目标是将它们分组到窗口中。我想让每个窗口的结束与每小时的 0、15、30 和 45 分钟一致。
由于这是一个流式作业,它可以随时启动,我想找到一种方法使第一个窗口的大小与下一个窗口的大小对齐。
这将是流:

  1. 启动作业
  2. 定义为window_size 从这一刻到下一刻钟之间的剩余时间
  3. 从第一个窗口的末尾开始,设置window_size = int(15*60)(秒)。

例如:

  1. 启动作业
  2. 现在是 11:18,所以修复window_size = (11:30-11:18).seconds
  3. 当第一个窗口结束时,设置window_size = int(15*60)(秒)

在 Google 提供的一个示例中,使用窗口化的管道定义如下,其中 window_size 是用户作为输入传递的参数:

def expand(self, pcoll):
  return (
          pcoll
          | "Window into Fixed Intervals" >> beam.WindowInto(window.FixedWindows(self.window_size))
          | "Add Key" >> beam.Map(lambda elem: (None, elem))
          | "Groupby" >> beam.GroupByKey()
          | "Abandon Key" >> beam.MapTuple(lambda _, val: val)
  )

【问题讨论】:

  • 根据documentation,窗口化根据其各个元素的时间戳细分PCollection。话虽如此,我想先问一下你的工作是如何执行的?
  • 正如我在问题中提到的,它是一个流式作业,它从 PubSub 接收事件,将它们分组到窗口中,然后在管道的后续步骤中执行其他操作。我想了解是否有可能在执行期间调整窗口大小,将一个 window_size 分配给第一个窗口,从第二个窗口开始分配另一个。

标签: python google-cloud-dataflow apache-beam windowing


【解决方案1】:

您的用例非常适合 Beam!

首先,有一个基本的概念问题需要澄清:

  • 元素上的时间戳,用于窗口化,称为“事件时间”。它们是数据的一部分,描述了您的信息流中的某些事件何时发生。
  • 启动和运行作业的时间称为“处理时间”。它不属于您的数据。

如果你不将这两者结合或混淆,你会更成功。 Windows 不会“开始”或“结束”作为作业处理时间的一部分。 Windows 一直“存在”。

使用 15 分钟的 FixedWindows 可以满足您的需求。每个事件都将与其所属的 15 分钟间隔相关联。当您启动您的工作或当一个事件到达以进行处理时不会影响这一点。

更新:添加示例来说明:

假设您在 11:18 开始您的工作,并假设传入事件大约在同一时间生成。假设出现以下事件,并显示时间戳:

  • A @ 11:01
  • B @ 11:18
  • C @ 11:15
  • D @ 11:31
  • E @ 11:29

元素将按如下方式分配给窗口:

  • [11:00, 11:15) 中的一个]
  • B in [11:15, 11:30)
  • C in [11:15, 11:30)
  • [11:30, 11:45] 中的 D
  • E in [11:15, 11:30)

请注意,窗口分配与您开始工作的时间、事件到达的时间或到达的顺序无关。您实际上可以在明天启动它,或者在存档数据上重新运行它,或者在顺序不接近的数据上重新运行它,结果将是相同的。事件时间窗口基于数据

【讨论】:

  • 如果您使用 FixedWindows,所有窗口都将具有相同的持续时间,无论它们何时启动。例如,对于 15 分钟的 FixedWindow,如果我在 10:53 运行作业,第一个窗口将是 10:53-11:08,第二个窗口是 11:08-11:23,第三个窗口是 11:23-11: 38 以此类推。问题是,如果我希望每个窗口与一刻钟完全一致,我该怎么办(例如,第一个窗口 10:53-11:00,第二个窗口 11:00-11:15,第三个窗口 11:15- 11:30,等等)?
  • 这是不正确的。 FixedWindows 的边界完全独立于您的作业何时运行。
  • 我用插图更新了答案。这有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多