2014-09-23 82 views
1

我們使用大型查詢JAVA API來檢索我們的分析報告前端的結果。我們試圖同步檢索結果。很多時候,我們得到讀取超時錯誤,即使在參數中指定的查詢超時之前。這裏的堆棧跟蹤的樣本失敗:讀取超時:通過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

你可以添加代碼片段嗎? – Mario 2014-09-23 12:54:08

+0

添加了代碼段。 – ferrisbueller 2014-09-24 12:23:29

+0

此查詢在BigQuery控制檯https://bigquery.cloud.google.com/中佔用了多長時間? – Mario 2014-09-24 13:12:11

回答

1

主要涉及兩個超時。第一個超時在您發送給bigquery的HTTP請求中。第二個是處於bigquery請求超時。這聽起來像你已經把後者設置爲一個很大的值,但前者可能是你打的超時。如果HTTP請求在BigQuery超時之前超時,則連接將被關閉,並且BigQuery將沒有機會作出響應。

有兩種選擇:首先是增加HTTP請求超時(取決於您使用的庫,但此頁面here可能會有所幫助)。二是減少 bigquery超時。這意味着您必須使用jobs.getQueryResults()來讀取實際結果,但這是一種更健壯的方法,因爲查詢需要多長時間無關緊要,您可以在循環中調用getQueryResults()。我會發佈一個鏈接到一個很好的java樣本,但不幸的是,我不知道這個樣本存在。

+0

我已經設置HTTP超時到3分鐘,查詢超時到2分鐘,我仍然得到相同的異常 - 「新的GoogleCredential.Builder().setTransport(新的NetHttpTransport()).setRequestInitializer(新的HttpRequestInitializer(){重寫def初始化(請求:QueryRequest().setQuery(query).setTimeoutMs(120000)':HttpRequest):Unit = {request.setConnectTimeout(60000)request.setReadTimeout(180000)}})' Query query- – pankajmi 2015-05-04 08:00:09

相關問題