google-cloud-platform - 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 秒的阈值。
以下是您可以选择的可能性列表:
- 优化查询语句,包括更改数据库模式以添加分区或集群。
- 使用Cloud SQL提供的关系数据库来获得更好的响应时间。
- 更改应用程序的架构。正如评论中建议的那样,在写入 BQ 之前转换数据是一个不错的选择,这样您就可以避免两次查询数据的延迟。有几篇文章使用 Dataflow 执行近实时计算(例如构建实时应用程序和实时聚合数据)。
另一方面,请记住,完成查询的时间不包含在 BigQuery SLA网页中,事实上,预计可能会发生错误并消耗更多时间来完成查询,请参阅中的退避要求同一个链接。
推荐阅读
- shared-libraries - 链接静态库 Vs。Linux 中的共享库
- c# - 如何从属性中获取日期时间,更改 getter 方法中的默认日期类型?
- azure - K8s azure VM 节点 - 可以从主节点 ping 工作节点,但无法 ping 工作节点上的 pod
- sql - 如何在 BigQuery 查询中转义百分号?
- javascript - 如何将值附加到元素 javascript 以使用 selenium 与元素交互
- android - 找不到retrofit2.Response 的调用适配器
安卓工作室 4.0
构建.gradle:
implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' implementation "com.squareup.retrofit2:converter-
- c++ - Pybind11:将元组列表从 Python 传递到 C++
- ruby-on-rails - 尝试从活动的 Rails 服务器进行 PG 转储并获取密码身份验证失败
- c# - 当键是动态的时从 JSON 获取子数据
- python - 我在 selenium 中使用 Chrome 网络驱动程序时遇到问题(非常奇怪的情况!!!)