【发布时间】: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