BigQuery Python 客户端 - 超时参数的含义,以及如何设置查询结果超时

Posted

技术标签:

【中文标题】BigQuery Python 客户端 - 超时参数的含义,以及如何设置查询结果超时【英文标题】:BigQuery Python client - meaning of timeout parameter, and how to set query result timeout 【发布时间】:2020-09-09 22:25:13 【问题描述】:

本题是关于 BigQuery Python 客户端中 QueryJob 对象的result 方法中的timeout 参数。

看起来timeout 的含义相对于版本 1.24.0 发生了变化。

例如,documentation for QueryJob's result in version 1.24.0 声明超时为:

在使用重试之前等待底层 HTTP 传输的秒数。如果在后台发出多个请求,超时被解释为所有请求的大致总时间。

据我了解,这可以用来限制result 方法调用等待结果的总时间。

例如,考虑以下脚本:

import logging

from google.cloud import bigquery

# Set logging level to DEBUG in order to see the HTTP requests
# being made by urllib3
logging.basicConfig(level=logging.DEBUG)

PROJECT_ID = "project_id" # replace by actual project ID

client = bigquery.Client(project=PROJECT_ID)

QUERY = ('SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` '
        'WHERE state = "TX" '
        'LIMIT 100')
TIMEOUT = 30  # in seconds
query_job = client.query(QUERY)  # API request - starts the query
assert query_job.state == 'RUNNING'

# Waits for the query to finish
iterator = query_job.result(timeout=TIMEOUT)
rows = list(iterator)

assert query_job.state == 'DONE'

据我了解,如果获取结果所涉及的所有 API 调用加起来超过 30 秒,则对 result 的调用将放弃。所以,timeout 这里用来限制result 方法调用的总执行时间。

但是,更高版本引入了更改。例如,documentation for result in 1.27.2 声明超时为:

在使用重试之前等待底层 HTTP 传输的秒数。如果在后台发出多个请求,则超时适用于每个单独的请求。

如果我理解正确的话,上面的例子完全改变了意思,对result 的调用可能需要超过 30 秒。

我的疑问是:

    如果我用新版本的result 运行上面的脚本与旧版本的脚本有什么区别? 目前推荐将timeout 值传递给result 的用例有哪些? 目前推荐的在等待查询结果时在给定总时间后超时的方法是什么?

谢谢。

【问题讨论】:

如果答案对您有所帮助,请考虑接受或投票 【参考方案1】:

正如您在fix 中看到的:

传输层超时独立于查询超时, 即等待查询完成的最长时间。

阻塞轮询使用查询超时,以便后端 在轮询作业完成时不会阻塞太久,但是 传输可以有不同的超时要求,我们不希望 它有时会引发不必要的超时错误。

对每个底层请求应用超时

由于作业方法不再在所有请求之间拆分超时 方法可能会做,Client 方法的调整方式相同。

所以基本区别在于,在之前的版本中,如果在下层发出许多请求,它们将共享 30 秒的超时。换句话说,如果第一个请求需要 20 秒,那么第二个请求将在 10 秒后超时。 在新版本中,每个请求都有 30 秒。

关于用例,基本上取决于您的应用程序。如果您不能长时间等待可能丢失的请求,您可以减少超时。

【讨论】:

以上是关于BigQuery Python 客户端 - 超时参数的含义,以及如何设置查询结果超时的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖 BigQuery 方法调用的默认超时

Bigquery 流式处理 API 超时错误

Bigquery 定价/客户支持?

使用 Python API 的 Bigquery 更新语句

com.google.cloud.bigquery.BigQueryException:读取超时

操作超时 - BigQuery 优化窗口功能