GroupBy/Combine 之后如何创建 Dataflow 包?

How are Dataflow bundles created after GroupBy/Combine?

设置:

从 pubsub 读取 -> window of 30s -> 按用户分组 -> 合并 -> 写入云数据存储

问题:

我看到 DataStoreIO 写入器错误,因为同一事务中存在具有相似键的对象。

问题:

  1. 我想了解我的管道如何在一组 by/combine 操作后将结果组合成包。我希望在合并后为每个 window 创建捆绑包。但显然,一个包可以包含超过 2 次出现的同一用户?

  2. 重新执行(重试)捆绑包会导致此行为吗?

  3. 这个捆绑依赖于运行器吗?

  4. 重复数据删除是一个选项吗?如果是这样,我该如何最好地处理它?

请注意,我不是在寻找管道末端数据存储编写器的替代品,我已经知道我们可以使用不同的策略。我只是想了解捆绑是如何发生的。

您的问题有两个答案。一个是特定于您的用例的,另一个是关于流媒体中的捆绑/windowing 的一般情况。


特定于您的管道

我假设 Datastore 的 'key' 是用户 ID?在这种情况下,如果您在多个 window 中有来自同一用户的事件,您的 GroupByKeyCombine 操作将为每一对 user+window 有一个单独的元素.

所以问题是:您要向数据存储中插入什么?

  • 单个用户在所有时间中产生的总和?在这种情况下,您需要使用全局 Window.
  • 用户每 30 秒的聚合结果?然后,您需要使用 window 作为用于插入数据存储的密钥的一部分。这有帮助/有意义吗?

很高兴能帮助您设计您的管道来做您想要的。在评论中或通过 SO 聊天与我聊天。


关于数据捆绑的更大问题

捆绑策略因跑步者而异。在 Dataflow 中,您应该考虑以下两个因素:

  • 每个工作人员都分配有一个键范围。相同键的元素将由相同的工作人员处理。
  • Windows属于单元素;但是 一个包可能包含来自多个 windows 的元素。例如,如果 数据新鲜度 指标大幅跃升*,可能会触发多个 windows - 并且相同键 [=] 的元素 不同的 windows 中的 46=] 将在同一个包 中处理

*- 数据新鲜度什么时候能突然跳起来?具有单个元素且时间戳非常旧且处理速度非常慢的流可能会保留水印很长时间。一旦这个元素被处理,水印可能会跳很多,到下一个最旧的元素(Check out this lecture on watermarks ; ))。