Google bigquery 流式插入API在与google API java客户端批处理请求一起使用时抛出500个错误

Google bigquery 流式插入API在与google API java客户端批处理请求一起使用时抛出500个错误,google-bigquery,Google Bigquery,我们正在使用流式插入API以及google API java客户端批处理请求 起初一切正常,但过了一段时间,它开始抛出500个错误: {"code":500,"errors":[{"domain":"global","message":"Unexpected. Please try again.","reason":"internalError"}],"message":"Unexpected. Please try again."} 代码片段如下所示: val batch = client.

我们正在使用流式插入API以及google API java客户端批处理请求

起初一切正常,但过了一段时间,它开始抛出500个错误:

{"code":500,"errors":[{"domain":"global","message":"Unexpected. Please try again.","reason":"internalError"}],"message":"Unexpected. Please try again."}
代码片段如下所示:

val batch = client.batch()   
val request = new TableDataInsertAllRequest()
request.setRows(rows)
val insertAll = client.tabledata().insertAll(ProjectId, datasetId, tableId, request)
insertAll.queue(batch, new MyCallback(datasetId, tableId, rows, retryAttempt))   
有时,我们也会遇到麻烦

{"code":500,"errors":[{"domain":"global","message":"Backend Error","reason":"backendError"}],"message":"Backend Error"}
注意:在获得错误之前,我们得到以下错误:

java.net.SocketTimeoutException: Read timed out
  at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.7.0_06]
    at java.net.SocketInputStream.read(SocketInputStream.java:150) ~[na:1.7.0_06]
    at java.net.SocketInputStream.read(SocketInputStream.java:121) ~[na:1.7.0_06]
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:312) ~[na:1.7.0_06]
    at sun.security.ssl.InputRecord.read(InputRecord.java:350) ~[na:1.7.0_06]
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927) ~[na:1.7.0_06]
    at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884) ~[na:1.7.0_06]
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:102) ~[na:1.7.0_06]
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) ~[na:1.7.0_06]
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:275) ~[na:1.7.0_06]
    at java.io.BufferedInputStream.read(BufferedInputStream.java:334) ~[na:1.7.0_06]
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:633) ~[na:1.7.0_06]
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579) ~[na:1.7.0_06]
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1322) ~[na:1.7.0_06]
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468) ~[na:1.7.0_06]
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338) ~[na:1.7.0_06]
    at com.google.api.client.http.javanet.NetHttpResponse.<init>(NetHttpResponse.java:36) ~[google-http-client-1.18.0-rc.jar:1.18.0-rc]
    at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:94) ~[google-http-client-1.18.0-rc.jar:1.18.0-rc]
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:965) ~[google-http-client-1.18.0-rc.jar:1.18.0-rc]
    at com.google.api.client.googleapis.batch.BatchRequest.execute(BatchRequest.java:241) ~[google-api-client-1.18.0-rc.jar:1.18.0-rc]                 
问题

这是什么原因? 我们应该怎么做才能解决这个问题? 编辑 -项目id是deft-DEVERTY-628
-我们正在使用流式插入api执行,并且没有作业id。

我们以前也遇到过类似的问题。以下是我们的一些发现,希望能对您有所帮助

关于java.net.SocketTimeoutException:Read timed out:很可能不是由于Bigquery方面,而是由于您的系统资源JVM或网络套接字或相关内容耗尽。我们最初在Windows Server 2008R2上的虚拟机上运行程序,当时我们遇到了很多套接字超时。自从我们转移到一个新的服务器并在本机上运行我们的程序以来,我们几乎没有看到过这种异常。此外,此超时有时会导致其他异常,如握手期间SSL连接关闭等

至于BigQuery500的错误:我们无法找到避免它的方法,因为它没有显示任何模式,BigQuery500不会完全禁止或失败您的以下请求。简单地进行回退无助于避免此错误,特别是如果使用多线程,则很难准确控制回退时间。所以,我们所做的是,如果发生500个错误,将数据放回队列并重试,事实是,平均在重试1-2次后,它成功了。尽管我们仍在等待关于处理此错误的优化方法的建议,但我们目前仍在继续尝试。通过这样做,500的错误发生了,但我们仍然可以将所有数据流化到Bigquery中


你有工作id的列表吗?同时提到项目id,BQ团队将能够识别这里提到的个别问题。我还发现建议使用insertId在500错误时重试。我们已经实现了重试机制。但由于错误太多,重试路径会导致正常执行出现问题。我们只是想知道这背后的原因是什么?这是由于我们使用api还是BQ方面的原因?还有,我们如何缓解这些问题?好吧,如果你查看我给你的链接和500年左右的其他帖子,你可能会认为这不是一个问题,可以在短时间内找到。根据我们的经验,您可能需要设计一个更好的机制来处理如此多且频繁的500错误,这样就不会导致正常执行出现问题。它现在给正常执行带来了什么样的问题?