如何将Google Cloud SQL与Google Big Query集成

12

我正在设计一个解决方案,其中将使用Google Cloud SQL来存储应用程序的所有常规运行数据(一种OLTP数据)。预计这些数据会随着时间的推移而变得非常庞大。由于数据本身具有关系型特性,因此我们选择了Cloud SQL而不是Cloud Datastore。

需要将这些数据输入到BigQuery进行分析,这需要实时或最佳情况下近乎实时的分析,尽管现实中可能会存在一些延迟。但我正在设计一种解决方案,以尽量减少这种滞后。

我的问题有3个部分 -

  1. 我应该使用Cloud SQL来存储数据,然后将其移动到BigQuery,还是更改基本设计,最初即使用BigQuery来存储数据? Big Query适合用于常规、低延迟的OLTP工作负载吗?(我认为不适合-我的假设正确吗?)

  2. 加载Cloud SQL数据到BigQuery的推荐/最佳做法是什么,如何使此集成接近实时工作?

  3. Cloud Dataflow是否是一个好的选择?如果我将Cloud SQL连接到Cloud DataFlow,然后进一步连接到BigQuery,这样可以吗?还是有其他更好的方法来实现这一点(如第2个问题所问)?

5个回答

15

看看WePay是如何做到的:

MySQL to GCS操作符对MySQL表执行SELECT查询。SELECT检索大于或等于上一个高水位标记的所有数据。如果表是仅追加的,则高水位标记是表的主键;如果表接收更新,则高水位标记是修改时间戳列。同样,SELECT语句也会向后推一点时间(或行),以捕获由于上述问题而可能丢失的行。

通过Airflow,他们每15分钟就能够将BigQuery与MySQL数据库保持同步。


13

BigQuery支持Cloud SQL联合查询,这允许您直接从BigQuery查询Cloud SQL数据库。为了保持Cloud SQL表与BigQuery同步,您可以编写一个简单的脚本,并使用以下查询每小时同步两个表。

INSERT
   demo.customers (column1)
SELECT
   *
FROM
   EXTERNAL_QUERY(
      "project.us.connection",
      "SELECT column1 FROM mysql_table WHERE timestamp > ${timestamp};");

请记得将 ${timestamp} 替换为当前时间戳减去1小时。


0

另一种方法是将写入过程拆分为CloudSQL和Cloud Pub/Sub,然后使用Dataflow读取器流式传输到BigQuery。当为您的BigQuery表格具有实质上不同的目标模式时(即在去规范化您的关系数据时通常发生),这种方法效果良好。

优点是可以将总体延迟降低到几秒钟;但主要缺点是,如果您的事务性数据高度变异,则必须创建版本控制方案以跟踪更改。


0

Google提供了一篇参考文章,介绍如何使用变更数据捕获工具来识别已更改的数据并仅推送它们。

这种方法可能有一些假设条件,可能不适用于您的情况:

  • 愿意学习Debezium
  • 愿意让GCP连接到您的源MySQL数据库

如果这些对您的情况适用,那么这似乎是一个不错的解决方案。


0

我认为你可以使用联合查询作为一种可能的解决方案:

联合查询是一种将查询语句发送到外部数据库并将结果作为临时表返回的方法。联合查询使用BigQuery连接API与外部数据库建立连接。在标准SQL查询中,您可以使用EXTERNAL_QUERY函数向外部数据库发送查询语句,使用该数据库的SQL方言。结果将转换为BigQuery标准SQL数据类型。

您可以将联合查询与以下外部数据库一起使用:

Cloud Spanner Cloud SQL 完成初始一次性设置后,您可以使用EXTERNAL_QUERY SQL函数编写查询。

我留下了文档,以便您可以在项目中实施它: https://cloud.google.com/bigquery/docs/federated-queries-intro


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - ldrg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接