我尝试使用基于Google samples的Java将数据从 kafka 安装流式传输到 BigQuery 。数据的长度为JSON行~12K。我将这些块分成500块(大约6Mb)并将它们流式传输为:
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以~10万行/分钟流式传输),但现在我很乐意处理这个问题。
所有行都插入正常。没有错误。
我必须对此设置做一些非常错误的事情。请指教。
答案 0 :(得分:1)
我们为每个流媒体请求测量1200到2500毫秒,这在过去三年中是一致的,如图所示,我们从Softlayer流向Google。
尝试将数字从数百行更改为数千行,或者直到达到某个streaming api limits并测量每个调用。
基于此,您可以推断出更多信息,例如您与BigQuery API之间的带宽问题,延迟,SSL握手,并最终针对您的环境对其进行优化。
您也可以留下您的项目ID /表格,也许某位Google工程师会检查它。