Read Timed Out:通过Bigquery java API进行同步查询

时间:2014-09-23 12:51:57

标签: google-bigquery

我们正在使用大查询JAVA API来检索分析报告前端的结果。我们试图同步检索结果。很多时候,即使在参数中指定的查询超时之前,我们也会收到读取超时错误。这是示例失败的堆栈跟踪:

java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)
    at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:830)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:787)
    at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:697)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:640)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
    at   sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
    at com.google.api.client.http.javanet.NetHttpResponse.<init>(NetHttpResponse.java:36)
    at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:94)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:965)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)

在检索 JobReference 对象之前,我无法检索生成的作业的作业ID,因为发生了错误。在这种情况下指定的超时是300秒。查询在它之前失败了。该查询包含三个JOIN和几个GROUP EACH BY子句。你能建议我们一种可能的调试方法吗?

添加代码段:

        QueryRequest queryInfo = new QueryRequest().setQuery(sql)
                .setTimeoutMs(timeOutInSec * 1000);

        // get project id
        BQGameConnectionDetails details = Config
                .getBQConnectionDetails(gameId);
        String projectId = details.getProjectId();
        Bigquery.Jobs.Query queryRequest = getInstance(gameId).jobs()
                .query(projectId, queryInfo);
        QueryResponse response = queryRequest.execute();

1 个答案:

答案 0 :(得分:1)

涉及两个超时。第一个超时是在您发送给bigquery的HTTP请求中。第二个是在bigquery请求超时。听起来你已经将后者设置为一个很大的值,但前者很可能是你击中的超时。如果HTTP请求在BigQuery超时之前超时,则连接将被关闭,BigQuery将无法响应。

有两种选择:首先是增加HTTP请求超时(这取决于您正在使用的库,但此页面here可能会有所帮助)。第二个是减少 bigquery超时。这意味着您必须使用jobs.getQueryResults()来读取实际结果,但这是一种更健壮的方法,因为查询所花费的时间并不重要,您只需调用getQueryResults()即可。一个循环。我会发布一个链接到一个很好的java样本,但不幸的是我不知道它存在。