【问题标题】:BigQueryIO.read() performance very slow - Apache BeamBigQueryIO.read() 性能非常慢 - Apache Beam
【发布时间】:2018-01-10 09:23:32
【问题描述】:

我正在尝试从包含 2410957408 条记录的 BigQuery 表中读取记录。 在 Apache Beam 中使用 BigQueryIO.readTableRows() 读取它们需要很长时间。

我正在使用默认机器类型“n1-standard-1”和自动缩放。

在不影响成本的情况下,可以采取哪些措施来显着提高性能?高内存或高 CPU 机器类型会有帮助吗?

【问题讨论】:

  • 当你说“永远”时,你到底是什么意思?您看到的响应时间是多少?您的 BQ 数据库的大小是多少?
  • @VS_FF 精确地用了 2 小时 27 分钟。我不知道数据库的大小,但表大小是 1.04 TB。
  • 使用了多少台机器?最大工人数有上限吗?
  • 作为一个实验,您是否尝试过将整个表提取到 Google Cloud Storage 存储桶并从那里读取数据?如果从 GCS 读取所需的时间相同,我想可能没有办法提高性能。如果它更快,那么从 GCS 读取时可能会实现更好的并行性。当然,这样做还有将表提取到 GCS 的额外步骤,并且您需要对管道进行额外的代码更改。
  • 2.5 小时导出 1TB 似乎过多。你有工作 ID 吗?

标签: google-bigquery google-cloud-dataflow apache-beam


【解决方案1】:

BigQueryIO.readTableRows() 将首先将表数据导出到 gcs 存储桶中,beam 工作人员将从那里使用导出。导出阶段是BigQuery API,它的性能不是很好,也不是Beam 实现的一部分。

【讨论】:

    【解决方案2】:

    我查看了您引用的工作,似乎大部分时间都花在了 Beam 摄取 BigQuery 导出的数据上,特别是似乎将 BigQuery 导出结果转换为TableRowTableRow 是一个非常庞大且效率低下的对象 - 为了获得更好的性能,我建议使用 BigQueryIO.read(SerializableFunction) 直接读取您的自定义类型。

    【讨论】:

    • 谢谢。我会试试的。
    • 您看到明显的改善了吗?如果是这样,您应该考虑接受这个答案。我还看到我的读取步骤比预期的要长得多(我也在使用 readTableRows)——很高兴知道它是否值得沿着这条路走。
    • @gilmatic 在我的实验中,read(SerializableFunction) 快了约 3 倍,因此绝对值得一试。
    猜你喜欢
    • 2018-09-28
    • 2021-05-24
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2013-12-01
    相关资源
    最近更新 更多