BigQuery—通过java进行流式处理非常慢
我试图使用基于Google的Java将kafka安装的数据流传输到BigQuery中。数据长度约为12K。我将这些数据分批放入500个大约6Mb的数据块中,并将其流式处理为:BigQuery—通过java进行流式处理非常慢,java,google-bigquery,Java,Google Bigquery,我试图使用基于Google的Java将kafka安装的数据流传输到BigQuery中。数据长度约为12K。我将这些数据分批放入500个大约6Mb的数据块中,并将其流式处理为: InsertAllRequest.Builder builder = InsertAllRequest.newBuilder(tableId); for (String record : bqStreamingPacket.getRecords()) { Map<String, Object> map
InsertAllRequest.Builder builder = InsertAllRequest.newBuilder(tableId);
for (String record : bqStreamingPacket.getRecords()) {
Map<String, Object> mapObject = objectMapper.readValue(record.replaceAll("\\{,", "{"), new TypeReference<Map<String, Object>>() {});
// remove nulls
mapObject.values().removeIf(Objects::isNull);
// create an id for each row - use to retry / avoid duplication
builder.addRow(String.valueOf(System.nanoTime()), mapObject);
}
insertAllRequest = builder.build();
...
BigQueryOptions bigQueryOptions = BigQueryOptions.newBuilder().
setCredentials(Credentials.getAppCredentials()).build();
BigQuery bigQuery = bigQueryOptions.getService();
InsertAllResponse insertAllResponse = bigQuery.insertAll(insertAllRequest);
我看到每次通话的插入时间为3-5秒。不用说,这使得BQ流没有什么用处。从他们的文档中,我担心从Kafka以每100万行/分钟的速度传输Im时会达到每表插入配额,但现在我很乐意解决这个问题
所有行都可以插入。没有错误
我一定是这个设置出了什么问题。请告知。我们对每个流媒体请求的测量值在1200-2500毫秒之间,这在过去三年中是一致的,正如您在图表中所看到的,我们从Softlayer流媒体到Google 试着将号码从数百到数千行不等,或者直到你找到一些号码并测量每个电话 基于此,您可以推断出更多信息,如您和BigQueryAPI之间的带宽问题、延迟、SSL握手,并最终针对您的环境进行优化
你也可以留下你的项目id/表格,也许一些谷歌工程师会检查它。所以如果我发送6-900万批,可能需要更长的时间?如果我发送超过1K行,我将超过10M限制。我们实现了我们的调用,例如发送不超过1K行和不超过10MB的有效负载限制。因此,当300行覆盖10Mb限制时,可能会出现这种情况,但1k行的总和可能不等于10Mb。我告诉你,你应该尝试这些数字,并帮助你理解什么可能会变慢。你还应该检查库,它不应该生成自己的线程,也不应该批处理自己的调用。我编辑了这些数字,因为它不正确。在我们运行的最大的BQ项目上,我们的平均时间是2秒。你能在你的回答中包含更多关于这个的细节吗?它不应该产生它自己的线程,也不应该批处理你自己的调用语句?