我将数据从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
工作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
读出的大部分数据仍然是原生格式。
我感谢任何指导!
答案 0 :(得分:0)
我也已经看到了这种行为,我解决它的方式(我不会说解决,因为这主要来自Google),是使用微批处理而不是流插入。当并发性很低时,流插入工作确实很好,但是对于真正的BigData(例如我的成千上万个),最好的方法是使用微分批处理。我正在使用FILE_LOADS选项,窗口显示了3分钟,效果很好。希望能对您有所帮助。