2016-07-14 61 views
1

目前我们有一个数据流程,其中我们有一个GroupByKey,但DoPar在group-by之后每个键得到太多的值,我们想知道是否有这个好的解决方案。从我可以告诉的是,没有办法设置每个窗口的最大数值。限制每个键值的数量

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

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

有没有一个标准的方法或最佳做法呢?

回答

2

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

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

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

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

  4. 如果ParDo的计算是联想和交换,写一个CombineFn将产生到存储更少的数据,并会提高批处理和流媒体整体管道性能。

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