Google cloud dataflow 防止谷歌数据流融合的最佳方法?

Google cloud dataflow 防止谷歌数据流融合的最佳方法?,google-cloud-dataflow,Google Cloud Dataflow,发件人: 您可以在第一次ParDo后插入GroupByKey并取消分组。数据流服务从不在聚合中融合ParDo操作 这就是我在python中提出的——这是否合理/是否有更简单的方法 def prevent_fuse(collection): return ( collection | beam.Map(lambda x: (x, 1)) | beam.GroupByKey() | beam.FlatMap(lambda x:

发件人:

您可以在第一次ParDo后插入GroupByKey并取消分组。数据流服务从不在聚合中融合ParDo操作

这就是我在python中提出的——这是否合理/是否有更简单的方法

def prevent_fuse(collection):
    return (
        collection
        | beam.Map(lambda x: (x, 1))
        | beam.GroupByKey()
        | beam.FlatMap(lambda x: (x[0] for v in x[1]))
        )
编辑,回答本·钱伯斯的问题


我们希望防止融合,因为我们有一个生成更大集合的集合,我们需要跨更大集合进行并行化。如果它熔断,我只能在更大的集合中找到一个工作线程。

应该可以。还有其他的方法,但部分取决于你想做什么以及你为什么要阻止核融合。请记住,fusion是提高管道性能的一个重要优化


你能详细解释一下为什么你想阻止融合吗?

对我最初的提议做一个小小的调整-如果每个项目都太大,那就失败了。您需要将它们强制放入多个项中,因此使用常量键不起作用。因此,在这里,您可以提供一个
函数,该函数需要区分对象,并且要小,就像散列一样

也就是说,仍然不确定这是最好的方法,或者更简单的(
beam.Partition
?)方法是否可行。这将有利于Beam提供一个显式的基本体

def prevent_fuse(collection, key=None):
    """
    prevent a dataflow PCol fusing with the next PCol
    supply a key function if the items are too big to use as keys
    """

    key = key or (lambda x: x)

    return (
        collection
        | beam.Map(lambda v: (key(v), v))
        | beam.GroupByKey()
        | beam.FlatMap(lambda kv: (v for v in kv[1]))
        )

ApacheBeamSDK 2.3.0添加了实验性转换,这是@BenChambers提到的
Reshuffle.viaramonkey
操作的Python替代方法。您可以使用它来代替自定义的
prevent\u fuse
代码。

添加了一条关于激励的注释为什么它取决于我们的努力?我们想要的是文档中描述的“请不要熔合这些”的内容?有不同的断开熔合的方法,它们具有不同的性能特征,更适合不同的情况。例如,在本例中,您希望确保这些转换之间的并行性不依赖于(如中所述)。这需要在捆绑包之间重新分配元素。如果您想要防止融合以解耦故障(也在执行模型中描述),那么还有其他可能更轻的选项。感谢您的澄清,这是有意义的。我们最大的问题是a)处理每个项目需要几GB的内存,b)我们有一些高扇出。我们是否应该以不同的方式处理这个问题?或者继续在此函数中包装任何扇出?beam.Partition不是您想要的--它将输入元素划分到不同的PCollection中。例如,如果要将以大写字母开头的元素与以小写字母开头的元素进行分区。在Java中,有一个操作正是您想要的。请注意,随机密钥与散列或其他任何东西一样有效。啊,太好了,我担心如果密钥不一致,它可能会导致问题。因此,在Python中,一个随机键似乎占主导地位,而在Java中,Reshuffle.viaRandomKey则占主导地位。@BenChambers您想更新您的答案以便在一个地方合成它吗?如果你喜欢,我可以调整我的