1

目前我们有一个数据流过程,GroupByKey但是DoPar在 group-by 之后每个键获得了太多的值,我们想知道是否有一个好的解决方案。据我所知,没有办法设置每个窗口的最大值数。

现在我们正在探索 3 个选项:

  1. 较小的 Windows - 我们认为我们可能仍然会遇到问题,因为事件可能会及时聚集在一起。
  2. 在每个键中添加一个随机值来对键进行分区 - 这也不理想,因为当我们有较少的事件进入时,每个键的值就会太少。当事件数量呈指数增长时,我们也无法调整分区数量。
  3. 一些花哨的触发或使用组合器 - 可能是最好的解决方案,但不知道如何做到这一点。

是否有这样做的标准方法或最佳实践?

4

1 回答 1

2

您提到的每个选项都是可能的,尽管哪个是理想的部分取决于您之后计算的内容以及您是在有界数据上运行批处理管道还是在无界数据上运行流式管道。

  1. 您可以创建一个自定义WindowFn来限制每个窗口中的元素数量。例如,您可以将每个元素分配给一个窗口,例如(1, [startTime, endTime)). 然后将多个窗口合并在一起,添加它们的计数。一旦计数过高,您就会停止合并。

  2. 随机细分密钥是确保分区并允许代码更好地跨机器分布的好方法。

  3. 您可以使用诸如“AfterPane.elementCountAtLeast(500)”之类的触发器来输出约 500 个元素的窗格。如果唯一的问题是可迭代到 DoFn 的大小,这应该会有所帮助。这也将产生更多/更早的输出,这可能是可取的,也可能不是可取的。

  4. 如果计算ParDo是关联的和可交换的,那么编写 aCombineFn将产生更少的数据存储,并将提高批处理和流式处理的整体管道性能。

如果您可以描述您的具体情况,可能会指导您采用这些解决方案之一。否则,我们建议从CombineFn可能的情况下开始,然后看看您是否需要寻求其他途径。

于 2016-07-15T21:56:26.050 回答