【问题标题】:Slow query times on small BigQuery table while streaming流式传输时对小型 BigQuery 表的查询时间较慢
【发布时间】:2017-11-09 00:54:14
【问题描述】:

我正在从 Cloud DataFlow 接收器将数据流式传输到三个 BigQuery 表中,但在其中一个目标表上看到非常慢的查询结果 - a “小”一个,大约 150 万行。如果我停止 DataFlow 流式传输作业并稍后返回表,则运行相同的查询 迅速地。这是标准 SQL 方言中的查询:

SELECT appname, start_time_to_minute, SUM(sum_client_bytes + sum_server_bytes) as `sum`
FROM `myproject.myset`.`mysmalltable`
GROUP BY 1, 2
  • 应用名称:字符串
  • start_time_to_minute:TIMESTAMP
  • sum_client_bytes:整数
  • sum_server_bytes:整数

作业 ID:bquijob_568af346_15c82f9e5ec - 需要 12 秒。

此表通过流式传输以每分钟约 2000 行的速度增长。同一个项目中的另一个目标表通过流式增长更快, 可能每分钟 200,000 行。如果我在流式传输时在mysmalltable 上运行上述查询,则可能需要将近一分钟。对于类似的查询,我们经历了几分钟的查询时间。

作业ID:bquijob_7b4ea8a1_15c830b7f12,耗时42.8s

如果我添加过滤器,情况会变得更糟,例如

WHERE REGEXP_CONTAINS(`appname`, 'Oracle')

作业ID:bquijob_502b0a06_15c830d9ecf,耗时57s

昨天一个花了超过 6 分钟:

Job ID:bquijob_49761f0d_15c80c6f415,耗时 6m38s

我了解,为了支持查询“实时”数据,BigQuery 有一个效率低得多的数据提供程序,它在流式传输之上运行 缓冲。这里有牵连吗?有没有一种方法可以让这些查询在 30 秒内可靠地运行?例如,以某种方式避免流式传输 缓冲并使用超过 1 分钟的旧数据?如果涉及到流式缓冲区,它对我来说仍然没有完全加起来,因为我原以为从mysmalltable 读取的大部分数据仍然是本机格式。

感谢任何指导!

【问题讨论】:

    标签: google-bigquery google-cloud-dataflow


    【解决方案1】:

    我也看到了这种行为,我解决它的方法(我不会说解决了,因为这主要来自 Google),是使用微批处理而不是流插入。当并发性较低时,流插入工作得非常好,但是对于真正的大数据(比如在我的例子中,数十万),最好的方法是使用微批处理。我正在使用 FILE_LOADS 选项,窗口时间为 3 分钟,效果非常好。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 2020-11-04
      • 2023-03-27
      • 2021-06-28
      • 2021-03-01
      相关资源
      最近更新 更多