BigQuery - 无法通过批处理API提交查询

时间:2016-05-17 20:00:25

标签: google-bigquery google-cloud-platform

我们的应用程序通过BigQuery的批处理API批量查询和提交。我们已经提交了几批查询,这些查询的工作现在已经处于“运行”状态超过一个小时。根据{{​​3}},所有系统都是绿色的,但对我们来说似乎并非如此。

其他人有类似的行为吗? FWIW - 由于超出并发速率限制(来自上述卡住的工作),通过BQ Web UI提交的查询不再适用于我们,所以有些事情是错误的......

1 个答案:

答案 0 :(得分:1)

您正在通过批处理API提交您的查询。看起来你很快就会这么做并且计算成本很高的查询,所以他们都互相竞争并放慢速度。

看起来您在18日(几次)大约同时提交了大约200个工作岗位,并且在17日提交了大约25,000个工作岗位。

这些都是以交互式查询优先级提交的,并且几乎所有这些都在超出速率限制时立即失败,从您提交的每组查询中保留了大约50个查询的最大并发配额限制。

检查其中一些查询:这些是计算上昂贵的查询。查看您的查询的结算层(https://cloud.google.com/bigquery/pricing#high-compute),可在此处的jobs.get输出中找到:https://cloud.google.com/bigquery/docs/reference/v2/jobs#statistics.query.billingTier。这些查询似乎也在重新计算相同(或至少非常相似)的中间连接结果。

当您同时运行50个大型查询时,它们将相互竞争资源并减速。

您可能希望了解以下几个问题:

  • 您正在以交互式查询优先级提交大量查询,该查询具有非常严格的concurrent rate limit。如果要同时运行多个查询,请尝试使用批量查询优先级。 https://cloud.google.com/bigquery/docs/reference/v2/jobs#configuration.query.priority
  • 您的查询组合看起来可以优化。您是否可以通过一个连接操作实现所有查询中常见的一些中间结果,然后针对这些结果运行大量较小的查询?
  • 如果您需要快速运行许多计算成本高昂的查询:
    • 您可能需要购买额外的插槽以提高查询吞吐量。见https://cloud.google.com/bigquery/pricing#slots
    • 您可能希望在客户端对自己进行速率限制,以防止计算成本高昂的查询相互竞争。考虑一次只运行几个查询。您的整体吞吐量可能会更快。
  • 您正在使用批量插入API。这使得使用一个HTTP请求插入多个查询非常有效。我发现HTTP连接很少是大规模数据分析延迟的原因,因此为了保持客户端代码简单,我更喜欢使用常规jobs.insert API并一次插入一个作业。 (当您想要处理错误情况时,这变得更加重要,因为使用批量插入操作很困难。)