如何在 Java 中为 BigQuery API 请求设置超时
Posted
技术标签:
【中文标题】如何在 Java 中为 BigQuery API 请求设置超时【英文标题】:How to set timeout for BigQuery API request in Java 【发布时间】:2014-08-19 14:25:11 【问题描述】:有时,当我们轮询 BigQuery 作业时,我们的请求以 SocketTimeoutException
结束。您可以在下面看到引发异常的代码。
this.bigquery.jobs().get(projectNumber, jobId).execute();
这是我们得到的错误信息。
...
Caused by: java.net.SocketTimeoutException:
Timeout while fetching URL: https://www.googleapis.com/bigquery/v2/projects/######/jobs/######
...
我的问题是是否有办法延长超时时间。有谁知道默认超时是多少?
【问题讨论】:
这是直接在代码中完成还是作为任务队列完成?请注意,即使您使用超时,您仍然需要将自己限制在 1 分钟的访问 url 限制或 10 分钟的任务队列限制 如果我超过了前端实例的最后期限,我会得到DeadlineExceededException
。这肯定与 BigQuery API 调用有关。
哦,我知道套接字和截止时间超时之间的区别。我只是说要小心增加你的截止日期,以免遇到其他错误^^
【参考方案1】:
您可以将凭证对象包装在禁用(或扩展)超时的 HTTP 初始化程序中。也就是说,你目前有这个:
Credential credential = ...
Bigquery bigquery = new Bigquery(HTTP_TRANSPORT, JSON_FACTORY, credential);
你可以的
final Credential credential = ...
HttpRequestInitializer initializer = new HttpRequestInitializer()
public void initialize(HttpRequest request)
credential.initialize(request);
request.connectTimeout = request.readTimeout = 0;
Bigquery bigquery = new Bigquery(HTTP_TRANSPORT, JSON_FACTORY, initializer);
请参阅this 了解 BigQuery 对象 javadoc,this 了解 BigQuery 对象创建示例,this 了解 HttpRequestInitializer 重载。
【讨论】:
我怎样才能将这样的连接与 BigQuery API 客户端一起使用?实际上,如果请求失败,我会重试请求,但是,我还是想延长超时时间。 嗯...我原以为这种方法是静态的。我已经更新了我的答案,希望能奏效。如果没有,请告诉我,我会 ping 内部 google api 人员。 嘿@JordanTigani,这仍然是缓解超时的首选方法吗?最近经常打他们(来自与 BQ 相同项目中的 App Engine 实例)【参考方案2】:如果是 请求 只是你想在请求正文中设置超时:
query_config =
'timeoutMs': 1000,
将 timeoutsMs 设置为您喜欢的任何值 ;)
希望对文档有所帮助的是 here
编辑
要获得查询的结果,即使它没有遵守超时调用jobs.getQueryResults
从站点获取,您必须指定一个起始行,这也需要一个与作业相同的超时。查询超时如果作业尚未完成,则允许等待。
【讨论】:
这仅与查询作业有关。我需要为任何 BigQuery API 请求设置超时。 它只解决查询请求。我担心与检索任何 BigQuery 作业(查询、加载、提取、链接)的 API 调用相关的超时。以上是关于如何在 Java 中为 BigQuery API 请求设置超时的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Google bigquery 中为多个动态表创建授权视图?
如何使用 Java API 使用标准 SQL 创建 BigQuery 视图?
如何使用 Google Bigquery 的 Java API 以 Json 形式获取查询结果