首页 > 解决方案 > Google DataFlow 管道中的 BigQuery 读取速度很慢

问题描述

对于我们的近实时分析,数据将流式传输到 pubsub 和 Apache Beam 数据流管道将通过首先写入 bigquery 进行处理,然后通过再次从 bigquery 读取进行聚合处理,然后将聚合结果存储在 Hbase 中以进行 OLAP 多维数据集计算。

这是用于从 bigquery 获取记录的示例 ParDo 函数

String eventInsertedQuery="Select count(*) as usercount from <tablename> where <condition>";
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
QueryJobConfiguration queryConfig
=QueryJobConfiguration.newBuilder(eventInsertedQuery).build();
TableResult result =  bigquery.query(queryConfig);
FieldValueList row = result.getValues().iterator().next();
LOG.info("rowCounttt {}",row.get("usercount").getStringValue());

bigquery.query 大约需要 4 秒。有什么改进的建议吗?由于这是近乎实时的分析,因此该持续时间是不可接受的。

标签: google-cloud-platformgoogle-analyticsgoogle-bigquerygoogle-cloud-dataflowapache-beam

解决方案


BigQuery 的频繁读取可能会在您的应用中增加不必要的延迟。如果我们认为 BigQuery 是Analytics 的数据仓库,我认为 4 秒是一个很好的响应时间。我建议优化查询以减少 4 秒的阈值。

以下是您可以选择的可能性列表:

  1. 优化查询语句,包括更改数据库模式以添加分区或集群
  2. 使用Cloud SQL提供的关系数据库来获得更好的响应时间。
  3. 更改应用程序的架构。正如评论中建议的那样,在写入 BQ 之前转换数据是一个不错的选择,这样您就可以避免两次查询数据的延迟。有几篇文章使用 Dataflow 执行近实时计算(例如构建实时应用程序实时聚合数据)。

另一方面,请记住,完成查询的时间不包含在 BigQuery SLA网页中,事实上,预计可能会发生错误并消耗更多时间来完成查询,请参阅中的退避要求同一个链接。


推荐阅读