流式传输时,BigQuery表上的查询时间较慢

时间:2017-06-07 15:12:39

标签: google-bigquery google-cloud-dataflow

我将数据从Cloud DataFlow接收器流式传输到三个BigQuery表中,但我看到其中一个目标表的查询结果非常慢 - “小”一,约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
  • 应用程序名称:STRING
  • start_time_to_minute:TIMESTAMP
  • sum_client_bytes:INTEGER
  • sum_server_bytes:INTEGER

工作ID:bquijob_568af346_15c82f9e5ec - 需要12秒。

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

职位编号:bquijob_7b4ea8a1_15c830b7f12,需要42.8秒

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

WHERE REGEXP_CONTAINS(`appname`, 'Oracle')

工作ID:bquijob_502b0a06_15c830d9ecf,需要57s

一个昨天花了6分钟:

工作ID:bquijob_49761f0d_15c80c6f415,耗时6m38s

据我所知,为了支持查询“实时”数据,BigQuery的数据提供程序效率低得多,它在流式传输之上运行 缓冲。这涉及到这个吗?有没有办法让我们可以在30秒以内可靠地运行这些查询?例如,以某种方式避免流式传输 缓冲并使用> 1分钟的旧数据?如果流媒体缓冲区有牵连,它仍然不会对我有用,因为我认为从mysmalltable读出的大部分数据仍然是原生格式。

我感谢任何指导!

1 个答案:

答案 0 :(得分:0)

我也已经看到了这种行为,我解决它的方式(我不会说解决,因为这主要来自Google),是使用微批处理而不是流插入。当并发性很低时,流插入工作确实很好,但是对于真正的BigData(例如我的成千上万个),最好的方法是使用微分批处理。我正在使用FILE_LOADS选项,窗口显示了3分钟,效果很好。希望能对您有所帮助。