如何在 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 视图?

在 Bigquery 中为多个 CSV 文件自动创建表

如何使用 Google Bigquery 的 Java API 以 Json 形式获取查询结果

如何在 BigQuery SQL 中为与按日期排序的主 ID 关联的子 ID 编号?

如何使用服务使用启用 Bigquery API?