Apache Beam Wall Time 不断增加
Apache Beam Wall Time keeps increasing
我有一个从 pubsub 主题读取的 Beam 管道,进行一些小的转换,然后将事件写入一些 BigQuery 表。
转换在处理上很轻松,可能会删除字段或其他内容,但是,正如您从下图中看到的那样,某些步骤的 Wall Time 非常长。究竟是什么导致了这种情况?
每个元素实际上都是 ((str, str, str), {**dict with data})
形式的元组。通过此键,我们实际上尝试通过使用此键获取最新事件来进行简单的重复数据删除。
基本上我在那之后添加的任何内容 Get latest element per key
都很慢,标记也很慢,即使它只是向元素添加一个标记。
我认为“慢”是指它每秒处理多少个元素?
这里发生了两件事。首先,我假设 Get latest element per key
包含某种 GroupByKey。这涉及全局洗牌,所有元素都通过网络发送到其他元素,以确保具有给定密钥的所有元素都分组到同一个工作程序中。这个 IO 可能很昂贵,至少就挂起时间而言是这样。
其次,不需要工人到工人通信的步骤被“融合”,从而耦合了它们的吞吐量。例如。如果有 DoFnA
后跟 DoFnB
后跟 DoFnC
,则处理通过将第一个元素传递给 DoFnA
,然后将这些输出传递给 DoFnB
并随后传递DoFnC
在获取第二个元素之前传递给 DoFnA
。这意味着如果其中一个 Fns(或读取或写入)具有有限的吞吐量,则所有 Fns 都将如此。
我有一个从 pubsub 主题读取的 Beam 管道,进行一些小的转换,然后将事件写入一些 BigQuery 表。
转换在处理上很轻松,可能会删除字段或其他内容,但是,正如您从下图中看到的那样,某些步骤的 Wall Time 非常长。究竟是什么导致了这种情况?
每个元素实际上都是 ((str, str, str), {**dict with data})
形式的元组。通过此键,我们实际上尝试通过使用此键获取最新事件来进行简单的重复数据删除。
基本上我在那之后添加的任何内容 Get latest element per key
都很慢,标记也很慢,即使它只是向元素添加一个标记。
我认为“慢”是指它每秒处理多少个元素?
这里发生了两件事。首先,我假设 Get latest element per key
包含某种 GroupByKey。这涉及全局洗牌,所有元素都通过网络发送到其他元素,以确保具有给定密钥的所有元素都分组到同一个工作程序中。这个 IO 可能很昂贵,至少就挂起时间而言是这样。
其次,不需要工人到工人通信的步骤被“融合”,从而耦合了它们的吞吐量。例如。如果有 DoFnA
后跟 DoFnB
后跟 DoFnC
,则处理通过将第一个元素传递给 DoFnA
,然后将这些输出传递给 DoFnB
并随后传递DoFnC
在获取第二个元素之前传递给 DoFnA
。这意味着如果其中一个 Fns(或读取或写入)具有有限的吞吐量,则所有 Fns 都将如此。