为什么以下google bigquery api会拨打400" Bad Request"而不是500(或更具体地说是503)?我通常不会重试400,因为它意味着我的请求有问题,但是当我查看错误消息中的描述时,它看起来像是服务器端的临时错误。此外,当我重试时,响应成功。
com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "The job encountered an error during execution. Retrying the job may solve the problem.",
"reason" : "jobBackendError"
} ],
"message" : "The job encountered an error during execution. Retrying the job may solve the problem."
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1056)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
我排除了剩余的专有堆栈跟踪,但代码如下所示,其中SQL很简单 - > "从project.ds.table
订单中选择* 1"
QueryRequest request = new QueryRequest().setQuery(queryString).setUseLegacySql(false).setTimeoutMs(1l);
QueryResponse resp = bq.jobs().query(projectId, request)
.execute();
根据Big Query Docs https://cloud.google.com/bigquery/troubleshooting-errors和普通的HTTP约定。我认为它应该是500或503。
backendError 500 or 503 This error returns when there is a temporary server failure such as a network connection problem or a server overload.
答案 0 :(得分:1)
我在生产中发现了同样的问题,偶尔会出现此HTTP 400错误消息。 Python库将其作为BadRequest异常引发。 这种异常很少出现,并且只有在负载很重的情况下(许多并发查询同时运行)。
问题在官方Python BigQuery客户端回购的this GitHub issue中进行了描述。出于以下动机,创建了一个内部Google问题并将其关闭是不可能的:
连接错误是作为作业结果返回的唯一可重试错误,因此,如果Jobs.getQueryResult()返回400并且错误原因设置为“ jobBackendError”,则只需添加逻辑即可重试job.insert()。这意味着该作业因连接错误而失败),但我认为您无法在这种情况下重复使用该作业ID。
我在Google支持上有一张目前开放的票证,要求他们将HTTP状态代码更改为500,或者至少以jobBackendError
的理由error table进行记录。
作为一种临时解决方法,您可以捕获所有HTTP 400异常,仅重试具有jobBackendError
,backendError
,internalError
原因的异常,然后重新引发其他异常。