【问题标题】:Apache Beam Wall Time keeps increasingApache Beam Wall Time 不断增加
【发布时间】:2020-12-09 19:32:47
【问题描述】:

我有一个 Beam 管道,它从 pubsub 主题读取数据,进行一些小的转换,然后将事件写入一些 BigQuery 表。

变换处理很轻松,可能会删除一个字段或其他东西,但是,如下图所示,对于某些步骤,Wall Time 非常高。究竟是什么原因造成的?

每个元素实际上都是((str, str, str), {**dict with data}) 形式的元组。通过这个键,我们实际上试图通过这个键获取最新事件来进行简单的重复数据删除。 基本上我在Get latest element per key 之后添加的任何内容都很慢,并且标记也​​很慢,即使它只是向元素添加了一个标签。

【问题讨论】:

    标签: python-3.x google-cloud-dataflow apache-beam


    【解决方案1】:

    我认为“慢”是指每秒处理多少个元素?

    这里发生了两件事。首先,我假设Get latest element per key 包含一个 GroupByKey 之类的。这涉及全局洗牌,所有元素都通过网络发送到其他元素,以确保具有给定密钥的所有元素都分组到同一个工作人员中。这种 IO 可能很昂贵,至少在挂墙时间方面是这样。

    其次,不需要 worker 到 worker 通信的步骤会被“融合”,从而耦合它们的吞吐量。例如。如果一个有DoFnA 后跟DoFnB 后跟DoFnC,则处理通过将第一个元素传递给DoFnA,然后将这些输出传递给DoFnB,随后传递给DoFnC,然后再传递第二个元素到DoFnA。这意味着如果 Fns 之一(或读取或写入)具有有限的吞吐量,那么它们都将。

    【讨论】:

    • 感谢您的解释。是的,该分组是由combiners.Latest.PerKey() 完成的,根据我的观察,就每秒元素而言,它的表现相当不错。主要瓶颈基本上是这一步之后发生的事情。现在是重新洗牌,在这之前是标记。我只有一个问题: - 我怎么知道某些步骤是融合在一起的?不知道是否有帮助,这里的错误是工作 id 2020-12-09_08_32_30-16230074399558339654 :)
    • 我实际上不确定有没有地方可以查看融合了哪些阶段,但通常它是两个 GBK 之间的所有内容。通常这不是您需要担心的事情。
    • 更新:如果您单击 Dataflow UI 中的一个步骤,在右侧 StepInfo 面板的底部,有一个名为“优化阶段”的部分。融合在一起的步骤将处于相同的优化阶段(例如 F__)。请注意,某些步骤可能跨越优化阶段。
    • 明白了。长城时间呢?我应该担心吗?我的意思是,这项工作运行了 48 小时,并且有一些疯狂的时间,比如 Reshuffle 阶段有 50 天,标签值有 13 天......一些疯狂的数字,我不确定我是否应该担心:)跨度>
    • Walltime 可能是一个有用的信号,但特别是如果涉及 IO,我不会担心它。 (流式管道是高度多线程的,它是每个线程的 walltime 总和。)
    猜你喜欢
    • 2021-05-26
    • 2017-07-13
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多