以增量方式将 Cloud SQL 转换为 BigQuery
Posted
技术标签:
【中文标题】以增量方式将 Cloud SQL 转换为 BigQuery【英文标题】:Cloud SQL to BigQuery incrementally 【发布时间】:2020-05-13 11:01:35 【问题描述】:我需要一些关于我正在处理的用例之一的建议。
用例:
我们在 Cloud SQL 中拥有大约 5-10 个表的数据,其中一些被视为查找,而另一些则被视为事务性的。我们需要将其提供给 BigQuery,以制作 3-4 个表(扁平化、嵌套或非规范化),这些表将用于 Data Studio、Looker 等中的报告。
数据应该以增量方式处理,Cloud SQL 中的更改可能每 5 分钟发生一次,这意味着 BigQuery 报告应该可以近乎实时地获取数据。如果可能,我们还应该维护数据更改的历史记录。
解决方案:
我们在 BigQuery 中保留了 3 层,因此来自 Cloud SQL 的数据进入第一层,然后在展平后将其保存到第二层(维护历史),然后将其处理以插入第三层(报告) . 这种方法的 问题是它是为日常处理而开发的,无法帮助处理 Cloud SQL 中每 5 分钟的数据变化。
欢迎提出任何建议。
注意:-我们需要使用Dataflow,VM或其他方式来做一些逻辑处理,这意味着我们不能只使用预定查询,因为我们不能使用查询来处理所有逻辑,但是可以混合使用视图和代码。
【问题讨论】:
【参考方案1】:这比您想象的要简单:BigQuery 可以直接从您的 Cloud SQL 中读取数据。
文档:
https://cloud.google.com/bigquery/docs/cloud-sql-federated-queries更多阅读:
https://medium.com/google-cloud/loading-mysql-backup-files-into-bigquery-straight-from-cloud-sql-d40a98281229所以您需要做的就是编写一个 MySQL 查询来查找过去 5 分钟内的所有更改。您可以在 BigQuery 中运行此查询 - 并通过一个查询将所有数据具体化到 BigQuery 中,例如:
INSERT INTO `dataset.table`
SELECT *
FROM EXTERNAL_QUERY(
'your.CloudSql.database'
, 'SELECT * FROM users')
【讨论】:
是否可以在计划查询中将此查询设置为每 5 分钟一次到 BigQuery 中?如果是这样,则同步接近实时 @Felipa,感谢您的回答,实际上我们正在对一些具有 5-6GB 数据的表使用联合查询工作,让我告诉 Postgres 无法直接处理,而是外部查询以更快的方式获取数据。 这里的事情就像我说的我需要用于报告的数据并且我正在连接 8-10 表,我在 Cloud SQL 上避免了这种情况,因为我认为它可能会导致那里出现问题。我使用普通查询和外部查询将每个表都发送到 BigQuery,然后使用 Dataflow 对其进行处理以将其带到第二层(历史维护),然后是报告层。现在,整个过程需要 15-20 分钟,因为 Dataflow 是批处理的。问题是我应该使用什么过程来加速这件事。您认为其他方式还是我可以在外部查询中使用那些 Big Join 并且它不会对 Cloud SQL 施加负载?【参考方案2】:这是一个有趣的用例!如果 BQ 外部查询不是您的难题,我们最近构建了一个解决方案,可将 MySQL 中的表与 BigQuery 中的表“同步”。
该解决方案通过使用两个组件来工作:
-
使用 Debezium 开发的连接器,用于将更改从 MySQL 发布到 PubSub
使用来自 PubSub 的更改并将其推送到 BigQuery 的 Dataflow 管道
请参阅此 README 以了解如何部署它:https://github.com/GoogleCloudPlatform/DataflowTemplates/tree/master/v2/cdc-parent/
如果有帮助请告诉我!
【讨论】:
以上是关于以增量方式将 Cloud SQL 转换为 BigQuery的主要内容,如果未能解决你的问题,请参考以下文章
将 SQL 地理转换为 SQL 几何或以其他方式提高查找速度