如何改善数据流管道中的低吞吐量 groupbykey

Posted

技术标签:

【中文标题】如何改善数据流管道中的低吞吐量 groupbykey【英文标题】:How to improve low throughput groupbykey in dataflow pipeline 【发布时间】:2020-08-18 17:51:43 【问题描述】:

我有一个 Apache Beam 批处理管道(用 Java 编写)将原始分析数据从 bigquery 转换为聚合形式。会话记录(现在可能会被接下来几天的页面事件扩展)和一组新的页面事件从 bigquery 中读取。然后,管道在聚合操作之前执行groupByKey 操作以按用户ID(跨两个数据集)分组以创建会话记录。 groupByKey 操作在较大的数据集(约 8400000 条记录)上执行非常缓慢(吞吐量约为每秒 50 条),而其他输入(约 1000000 条记录)的吞吐量要高得多(每秒约 10000 条)。有人对我如何排除故障并最终提高操作速度有任何建议吗?

根据在线研究,我知道有时使用Combine 操作而不是groupByKey(除此之外还有article)会更有效,但我认为这不适合我的数据分组(BQ TableRow 记录)。

更多可能有用的信息:

groupByKey 将 8400000 纳入大约 3500000 条分组记录中,每个键组合的范围约为 2000 到 1 条记录 我完全承认我对 apache Beam 和数据流的复杂性缺乏全面的了解,并且渴望了解更多,因为我将构建许多不同的管道。 下面是数据流图的截图

【问题讨论】:

【参考方案1】:

Beam 中的各个阶段在 Dataflow 上运行时会得到 fused together,这意味着舞台上的吞吐量与其他阶段相关,因此很可能不是 GroupByKey 而是相邻的 DoFns 导致了缓慢。如果您单击一个步骤,您可以看到步骤信息选项卡,这是一个为执行特定步骤提供时间的字段。我会看看您的管道中是否有围绕该 GroupByKey 的特定步骤,该步骤具有很高的挂壁时间。

【讨论】:

感谢您的回复。我对此进行了研究,不幸的是,它肯定是 GroupByKey 本身导致了缓慢 两者的数据大小是否相似?

以上是关于如何改善数据流管道中的低吞吐量 groupbykey的主要内容,如果未能解决你的问题,请参考以下文章

从数据流管道写入 BQ 时的动态表名

Linux 上的低延迟串行通信

如何实现嵌入式处理器的低功耗?其工作原理是啥?

随着执行的推进 + 意外的侧输入行为,数据流管道吞吐量急剧下降

light4j/light-4j一个轻量级的低延时高吞吐量内存占用量小的API平台

Linux管道到底能有多快?