随着更多数据通过转换传递,数据流管道自定义转换性能会降低

Dataflow pipeline custom transform performance decreases as more data is passed through transform

我有一个数据流管道 (Java 1.9.0),它从 GCS 读取数据并进行转换,然后输出到 GroupBy 转换。

我已经 运行 将这条管道投入生产几个月了,没有出现任何问题。但是今天管道开始花费两倍的时间 运行。我将 6 亿行读入管道并通过转换步骤 X 传递它。以前步骤 X 将以 200k/sec 的速度处理行,但现在我注意到在 5.75 亿行通过步骤 X 之后性能急剧下降到大约 5K/秒。

我在步骤 X 中添加了日志记录,以查看当超过 5.75 亿行已通过转换时我的代码是否在管道结束时花费了更多时间,但我看到管道以 200k 处理时的时间一致/秒

由于 BigQuery 导入异常缓慢(耗时一个多小时)以及服务端错误(如果在某些情况下速度太慢可能导致作业失败),此作业已失败:我们正在调查该错误。

尝试 运行 你的工作 --experiments=enable_custom_bigquery_sink 或将你的 SDK 更新到 2.0+ - 这应该可以解决问题。

我还注意到这项工作的流水线结构似乎比它应该的复杂得多(它使用了大量类似的流水线步骤,我相信许多类似的步骤可以被压缩成一步)。

我建议在 Whosebug 上发布一个问题,大致描述您要完成的任务,并询问用 Beam/Dataflow.

表达它的更简单方法是什么

特别是,我怀疑 TextIO.readAll() 转换会对您有很大帮助(在 HEAD 的 Beam 或应该很快发布的 2.2 中可用)- 参见 https://github.com/apache/beam/blob/master/sdks/java/core/src/main/java/org/apache/beam/sdk/io/TextIO.java - 以及可能,BigQuery 中的 DynamicDestinations 支持(自 2.0 起可用)。