限制每个键的值的数量

时间:2016-07-14 01:07:59

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

目前我们有一个数据流流程,我们有一个GroupByKey但是分组后的DoPar每个键的值太多,我们想知道是否有一个很好的解决方案。据我所知,没有办法为每个窗口设置最大值。

目前我们正在探索3个选项:

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

1 个答案:

答案 0 :(得分:2)

您提到的每个选项都是可能的,虽然这是理想的,但部分取决于您之后的计算内容以及您是否在有界数据上运行批处理管道或在无界数据上运行流式传输管道。 / p>

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

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

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

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

  5. 如果您可以描述您的具体信息,可以指导您采用其中一种解决方案。否则,我们建议尽可能从CombineFn开始,看看之后是否需要寻求其他途径。