Google cloud dataflow 为什么是“;分组依据”;比我的自定义CombineFn或asList()慢这么多?

Google cloud dataflow 为什么是“;分组依据”;比我的自定义CombineFn或asList()慢这么多?,google-cloud-dataflow,Google Cloud Dataflow,几个月前,我错误地使用了以下逻辑来实现与PCollectionView的asList()方法相同的功能: 我为集合中的每个元素分配了一个伪键“000” 然后我在这个伪键上做了一个groupBy,这样我就可以在一个数组列表中得到我所有元素的列表 当我的收藏中只有大约200个元素时,上面的逻辑工作得很好。当我在5000个元素上运行它时,它运行了几个小时,直到我最终杀死它。然后,我创建了一个自定义的“CombineFn”,在其中,我基本上将所有元素都放入了我自己的本地哈希表中。这是有效的,即使在我的5

几个月前,我错误地使用了以下逻辑来实现与PCollectionView的asList()方法相同的功能:

  • 我为集合中的每个元素分配了一个伪键“000”
  • 然后我在这个伪键上做了一个groupBy,这样我就可以在一个数组列表中得到我所有元素的列表
  • 当我的收藏中只有大约200个元素时,上面的逻辑工作得很好。当我在5000个元素上运行它时,它运行了几个小时,直到我最终杀死它。然后,我创建了一个自定义的“CombineFn”,在其中,我基本上将所有元素都放入了我自己的本地哈希表中。这是有效的,即使在我的5000元素的情况下,它也在大约一分钟或更短的时间内运行。类似地,我后来了解到我可以使用asList()方法,并且该方法也在不到一分钟的时间内运行。然而,让我担心的是——我不明白的是——为什么by小组花了这么长的时间运行(即使只有200个元素,也需要几秒钟以上),而5000个元素却运行了几个小时,似乎什么都没有完成


    我查看了GROUPBY代码,它似乎执行了很多我不太理解的步骤……它是否与GROUPBY语句试图跨集群运行的事实有关?或者可能与使用高效的编码器有关?还是我错过了什么?我问的原因是,在某些情况下,我被迫使用GROUPBY语句,因为数据集太大,无法放入任何一台计算机的RAM中。但是,我担心我不理解如何正确使用group by语句,因为它看起来太慢了…

    有一些因素可能会导致性能变慢。首先,如果您使用的是SerializableCoder,那么速度会非常慢,并且可能会更好地为您服务。其次,如果您在GBK之后在ParDo中迭代Iterable,如果您有足够的元素,那么您将超过缓存并多次获取相同的数据。如果需要这样做,显式地将数据放在容器中会有所帮助。CombineFn和asList方法都可以为您做到这一点