【问题标题】:Best way to prevent fusion in Google Dataflow?防止谷歌数据流融合的最佳方法?
【发布时间】:2017-11-07 16:03:17
【问题描述】:

发件人:https://cloud.google.com/dataflow/service/dataflow-service-desc#preventing-fusion

您可以在第一个 ParDo 之后插入 GroupByKey 并取消组合。 Dataflow 服务从不跨聚合融合 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]))
        )

编辑,回应 Ben Chambers 的问题

我们希望防止融合,因为我们有一个集合会生成一个更大的集合,并且我们需要跨更大的集合进行并行化。如果它融合了,我只会在更大的集合中找到一名工人。

【问题讨论】:

    标签: google-cloud-dataflow


    【解决方案1】:

    Apache Beam SDK 2.3.0 添加了实验性的Reshuffle 转换,这是@BenChambers 提到的Reshuffle.viaRandomKey 操作的Python 替代方案。您可以使用它来代替您的自定义 prevent_fuse 代码。

    【讨论】:

      【解决方案2】:

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

      您能否详细说明为什么要阻止融合?

      【讨论】:

      • 添加了关于动机的评论
      • 为什么这取决于我们要做什么?我们想要一些“请不要融合这些”的东西,如文档中所述?
      • 有不同的方式来破坏融合,它们具有不同的性能特征,更适合不同的情况。例如,在您的情况下,您希望确保这些转换之间的并行性不依赖(如Beam Execution Model 中所述)。这需要在包之间重新分配元素。如果您想防止融合以解耦故障(也在执行模型中描述),还有其他可能更轻量级的选项。
      • 有道理,感谢您的澄清。我们最大的问题是 a) 处理每个项目需要几 GB 的内存 b) 我们有一些高扇出。我们应该以不同的方式处理这个问题吗?或者继续在这个函数中封装任何扇出?
      【解决方案3】:

      对我原来的提议做一个小调整——如果每个项目都太大,那会失败就会失败。您需要将它们强制为多个项目,因此使用常量键不起作用。所以在这里,你可以提供一个key 函数,它需要区分对象并且很小,就像一个哈希一样。

      也就是说,仍然不确定这是最好的方法,或者更简单的方法 (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]))
              )
      

      【讨论】:

      • beam.Partition 不是你想要的——它在不同的 PCollection 之间划分输入元素。例如,如果您想对以大写字母开头的元素和以小写字母开头的元素进行分区。在 Java 中,有一个 Reshuffle.viaRandomKey 操作,这正是您正在寻找的。请注意,随机密钥与散列或其他任何内容一样有效。
      • 啊,太好了,我担心如果密钥不一致可能会导致问题。因此,随机键在 Python 中似乎占主导地位,而在 Java 中则为 Reshuffle.viaRandomKey。
      • @BenChambers 你想更新你的答案,以便在一个地方综合吗?如果你有偏好,我可以调整我的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2020-10-14
      • 1970-01-01
      相关资源
      最近更新 更多