目前我们有一个数据流流程,我们有一个GroupByKey
但是分组后的DoPar
每个键的值太多,我们想知道是否有一个很好的解决方案。据我所知,没有办法为每个窗口设置最大值。
目前我们正在探索3个选项:
这样做有标准的方法或最佳做法吗?
答案 0 :(得分:2)
您提到的每个选项都是可能的,虽然这是理想的,但部分取决于您之后的计算内容以及您是否在有界数据上运行批处理管道或在无界数据上运行流式传输管道。 / p>
您可以创建一个限制每个窗口中元素数量的自定义WindowFn
。例如,您可以将每个元素分配给一个窗口,例如(1, [startTime, endTime))
。然后将多个窗口合并在一起,添加其计数。一旦计数太高,就会停止合并。
随机细分密钥是确保分区并允许代码更好地跨机器分布的好方法。
您可以使用触发器,例如" AfterPane.elementCountAtLeast(500)"输出~500个元素的窗格。如果唯一的问题是可迭代到DoFn的大小,这应该有所帮助。这也会产生更多/更早的输出,这可能是也可能不是。
如果ParDo
中的计算是关联且可交换的,则编写CombineFn
将产生更少的数据存储,并将提高批处理和流式传输的整体管道性能。
如果您可以描述您的具体信息,可以指导您采用其中一种解决方案。否则,我们建议尽可能从CombineFn
开始,看看之后是否需要寻求其他途径。