在GroupBy / Combine之后如何创建数据流包?

时间:2019-03-06 15:24:01

标签: google-cloud-dataflow apache-beam

设置:

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

问题:

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

问题:

  1. 我想了解在进行分组/组合操作后,管道如何将结果组合到包中。我希望合并后为每个窗口创建捆绑包。但是很显然,一个捆绑包可以包含同一用户出现的两次以上?

  2. 捆绑软件的重新执行(重试)会导致这种现象吗?

  3. 这个捆绑依赖于跑步者吗?

  4. 重复数据删除是一种选择吗?如果是这样,我将如何最好地解决呢?

请注意,我并没有在管道的结尾寻找替代的数据存储编写器,我已经知道我们可以使用其他策略。我只是想了解捆绑是如何发生的。

1 个答案:

答案 0 :(得分:1)

您的问题有两个答案。一个特定于您的用例,另一个通常与流中的捆绑/窗口化有关。


特定于您的管道

我假设数据存储区的“密钥”是用户ID?在这种情况下,如果在多个窗口中有来自同一用户的事件,则您的GroupByKeyCombine操作将为每对用户+窗口有一个单独的元素。

问题是:您要插入到数据存储中的内容是什么?

  • 单个用户在整个时间内生成的汇总 ?在这种情况下,您需要使用全局窗口。
  • 用户每30秒产生的汇总?然后,您需要将该窗口用作插入到数据存储区的键的一部分。这有帮助/有意义吗?

很乐意帮助您设计管道以完成所需的工作。在评论中或通过SO聊天与我聊天。


关于数据捆绑的更大问题

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

  • 每个工作人员都被分配一个密钥范围。相同键的元素将由同一工作人员处理。
  • Windows属于单个元素;但捆绑商品可能包含来自多个窗口的元素。例如,如果数据新鲜度指标发生了大幅度的变化*,则可能会触发多个窗口-不同窗口中相同键的元素 / strong>将在同一捆绑中处理

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