BigQuery - 通过 java 流式传输非常慢
Posted
技术标签:
【中文标题】BigQuery - 通过 java 流式传输非常慢【英文标题】:BigQuery - streaming via java is very slow 【发布时间】:2017-02-24 22:54:49 【问题描述】:我正在尝试使用基于 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 以大约 100 万行/分钟的速度流式传输),但现在我很乐意处理这个问题。
所有行插入正常。没有错误。
我一定是在这个设置上做错了什么。请指教。
【问题讨论】:
【参考方案1】:我们测量每个流式传输请求的时间在 1200-2500 毫秒之间,这在过去三年中是一致的,如图所示,我们从 Softlayer 流式传输到 Google。
尝试将数字从数百行变为数千行,或者直到您达到某个 streaming api limits 并测量每个呼叫。
基于此,您可以推断出更多信息,例如您与 BigQuery API 之间的带宽问题、延迟、SSL 握手,并最终针对您的环境进行优化。
您也可以留下您的项目 ID/表,也许某些 Google 工程师会检查它。
【讨论】:
所以如果我发送 6-9M 批次可能需要更长的时间?如果我发送超过 1K 行,我将超过 10M 限制。 我们实现了我们的调用,例如我们发送不超过 1k 行和不超过 10Mbyte 有效负载限制。因此,可能会出现 300 行覆盖 10Mb 限制的情况,但可能是 1k 行不等于 10M。我告诉你,你应该试验一下这些数字,帮助你了解什么可能会很慢。 您还应该检查库,它不应该产生自己的线程,也不应该批处理您自己的调用。 我编辑了这些数字,因为它不正确。我们运行的最大 BQ 项目的平均时间是 2 秒。 您能否在回答中包含有关此it should not spawn it's own thread and it should not batch your own call
声明的更多详细信息?以上是关于BigQuery - 通过 java 流式传输非常慢的主要内容,如果未能解决你的问题,请参考以下文章
直接流式传输到 BigQuery 与通过 Google Pub/Sub + Dataflow 流式传输的优缺点
使用java将json数据流式传输到Bigquery中。不使用作业加载数据
在谷歌应用引擎中将数据流式传输到 bigquery - java
Google BigQuery - 将数据流式传输到 BigQuery