Google cloud dataflow 限制每个键的值数

Google cloud dataflow 限制每个键的值数,google-cloud-dataflow,dataflow,apache-beam,Google Cloud Dataflow,Dataflow,Apache Beam,目前,我们有一个数据流流程,其中我们有一个GroupByKey,但是groupby之后的DoPar每个键获得了太多的值,我们想知道是否有一个好的解决方案。据我所知,没有办法设置每个窗口的最大值 目前,我们正在探索3种选择: 较小的窗口-我们认为我们可能仍然有问题,因为事件可能会在时间上聚集在一起 在每个键中添加一个随机值来划分键-这也是不理想的,因为当我们传入的事件较少时,每个键的值就会太少。此外,当事件数呈指数增长时,我们也不能调整分区数 一些花式触发或使用组合器-可能是最好的解决方案,但不知

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

目前,我们正在探索3种选择:

  • 较小的窗口-我们认为我们可能仍然有问题,因为事件可能会在时间上聚集在一起
  • 在每个键中添加一个随机值来划分键-这也是不理想的,因为当我们传入的事件较少时,每个键的值就会太少。此外,当事件数呈指数增长时,我们也不能调整分区数
  • 一些花式触发或使用组合器-可能是最好的解决方案,但不知道如何做到这一点

  • 有没有标准的方法或最佳实践可以做到这一点?

    您提到的每一个选项都是可能的,尽管这在一定程度上取决于您以后的计算内容,以及您是在有界数据上运行批处理管道还是在无界数据上运行流式管道

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

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

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

  • 如果
    ParDo
    中的计算是关联的和可交换的,那么编写
    CombineFn
    将减少存储的数据量,并将改善批处理和流式处理的总体管道性能

  • 如果您能描述您的具体情况,这可能会引导您找到其中一种解决方案。否则,如果可能,我们建议从
    CombineFn
    开始,然后看看您是否需要寻求其他途径