Google cloud dataflow 使用withTemplateCompatibility的BigQueryIO读取性能

Google cloud dataflow 使用withTemplateCompatibility的BigQueryIO读取性能,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,ApacheBeam2.1.0有一个从BigQuery读取的模板管道缺陷,这意味着它们只能执行一次。这里有更多细节 Beam 2.2.0版本已经解决了这一问题,您现在可以使用withTemplateCompatibility选项读取BigQuery,您的模板管道现在可以运行多次 pipeline .apply("Read rows from table." , BigQueryIO.readTableRows() .with

ApacheBeam2.1.0有一个从BigQuery读取的模板管道缺陷,这意味着它们只能执行一次。这里有更多细节

Beam 2.2.0版本已经解决了这一问题,您现在可以使用withTemplateCompatibility选项读取BigQuery,您的模板管道现在可以运行多次

  pipeline
    .apply("Read rows from table."
         , BigQueryIO.readTableRows()
                     .withTemplateCompatibility()
                     .from("<your-table>")
                     .withoutValidation())
管道
.apply(“从表中读取行。”
,BigQueryIO.readTableRows()
.withTemplateCompatibility()
.从(“”)
.withoutValidation())
这个实现似乎给BigQueryIO读取操作带来了巨大的性能成本,我现在有批处理管道,运行时间8-11分钟,现在一直需要45-50分钟才能完成。两个管道之间的唯一区别是。withTemplateCompatibility()

我正在努力了解性能大幅下降的原因,以及是否有任何方法可以改进它们

谢谢

解决方案:基于jkff的输入

  pipeline
    .apply("Read rows from table."
         , BigQueryIO.readTableRows()
                     .withTemplateCompatibility()
                     .from("<your-table>")
                     .withoutValidation())
    .apply("Reshuffle",  Reshuffle.viaRandomKey())
管道
.apply(“从表中读取行。”
,BigQueryIO.readTableRows()
.withTemplateCompatibility()
.从(“”)
.withoutValidation())
.apply(“Reshuffle”,Reshuffle.viaandomkey())

我怀疑这是因为
与TemplateCompatibility
的兼容性是以禁用此读取步骤为代价的


我认为只有当您读取少量或中等数量的数据,但对其执行非常繁重的处理时,它才会产生显著的影响。在这种情况下,请尝试在
BigQueryIO.read()
上添加一个
Reshuffle.viaandomkey()
。它将实现数据的临时副本,但将更好地并行下游处理。

谢谢,jkff。这就解决了问题,但我看到改组转换被标记为不推荐使用且供内部使用。不幸的是,我们知道它需要替换(因此不推荐使用),但我们还没有替换:(您现在可以安全地使用它。您能解释一下“它将实现数据的临时副本”是什么意思吗?谢谢!这意味着它不仅会从BigQuery读取数据并立即通过转换进行处理,还会将数据从BigQuery临时复制到GCS,并从该副本读取。