BigQuery - 通过java流式传输非常慢

时间:2017-02-24 22:54:49

标签: java google-bigquery

我尝试使用基于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万行/分钟流式传输),但现在我很乐意处理这个问题。

所有行都插入正常。没有错误。

我必须对此设置做一些非常错误的事情。请指教。

1 个答案:

答案 0 :(得分:1)

我们为每个流媒体请求测量1200到2500毫秒,这在过去三年中是一致的,如图所示,我们从Softlayer流向Google。

enter image description here

尝试将数字从数百行更改为数千行,或者直到达到某个streaming api limits并测量每个调用。

基于此,您可以推断出更多信息,例如您与BigQuery API之间的带宽问题,延迟,SSL握手,并最终针对您的环境对其进行优化。

您也可以留下您的项目ID /表格,也许某位Google工程师会检查它。