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秒钟。有什么改进的建议吗?由于这是接近实时的分析,因此此持续时间是不可接受的。

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

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

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

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

最新更新