为啥 BigQuery API 调用需要这么长时间?

Posted

技术标签:

【中文标题】为啥 BigQuery API 调用需要这么长时间?【英文标题】:Why does BigQuery API call take so long?为什么 BigQuery API 调用需要这么长时间? 【发布时间】:2021-04-19 19:11:39 【问题描述】:

我正在尝试使用 BigQuery API 和 Python 客户端库查询 BigQuery。

但是,由于某种原因,在调用 BigQuery API 时,我的查询似乎“挂起”了大约 150 秒,即在以下行(完整代码示例见下文): results = client.query(query)

注意:实际查询是什么并不重要。因此,在下面的示例代码中,我只是将SELECT 1 作为查询。

有趣的是,第一个查询只有一个延迟 - 所有后续查询都与预期一样快。

我在 BQ 的查询历史记录中检查了查询时间,它确认所有查询都用时不到一秒。所以这绝对不是实际的查询需要这么长时间,而是别的什么。

我猜这可能与身份验证有关,但我不确定为什么会这样,或者我是否做错了什么 - 或者如何加快速度,最重要的是。

非常感谢任何提示。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# IMPORTS
from google.cloud import bigquery
import os 
from datetime import datetime

print(f"datetime.now().strftime('%H:%M:%S'): Starting script...")

# INIT BQ
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "my_credentials.json"
client = bigquery.Client()

# QUERY 1
print(f"datetime.now().strftime('%H:%M:%S'): Starting query 1...")

query1 = """SELECT 1 AS mycol LIMIT 1"""

print(f"datetime.now().strftime('%H:%M:%S'): Making API request...")
results1 = client.query(query1) # <-- this is where the 150s delay happens

for row in results1:
    print(f"datetime.now().strftime('%H:%M:%S'): Results: row['mycol']")

# QUERY 2
print(f"datetime.now().strftime('%H:%M:%S'): Starting query 2...")

query2 = """SELECT 2 AS mycol LIMIT 1"""

print(f"datetime.now().strftime('%H:%M:%S'): Making API request...")
results2 = client.query(query2) # <-- this is super-quick

for row in results2:
    print(f"datetime.now().strftime('%H:%M:%S'): Results: row['mycol']")

#EOF

这是输出(在我的本地机器上运行):

22:33:48: Starting script...
22:33:48: Starting query 1...
22:33:48: Making API request... # <-- this is taking ~150s
22:36:24: Results: 1
22:36:24: Starting query 2...
22:36:24: Making API request...
22:36:26: Results: 2

【问题讨论】:

响应头中有什么?特别是关于平台的速率限制?授权期间会发生什么(这显然是原因)?在第一个查询中发生了多少实际请求? 不知道如何回答。你能告诉我如何编辑我的代码让你知道吗? 您能否启用详细日志记录以查看问题所在?我的建议是获取任何日志信息,如果您无法从那里弄清楚,请在 GitHub 上提出问题,将其作为潜在错误提出! 如何启用详细日志记录? 您的项目或组织中是否有特殊配置?插槽和预订? 【参考方案1】:

好的,经过两天的尝试寻找解决方案,昨天花费了 160 秒的完全相同的脚本现在运行了大约 4 秒。 Google 方面似乎出了点问题。

【讨论】:

以上是关于为啥 BigQuery API 调用需要这么长时间?的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有网络连接时 Alamofire 需要这么长时间才能超时?

为啥这个查询需要这么长时间?

为啥这个 tensorflow 训练需要这么长时间?

为啥我的 mysql 简单外连接需要这么长时间?

为啥在 VCC 2003 中编译需要这么长时间?

为啥'withColumn'在pyspark中需要这么长时间?