【问题标题】:Fastest way to get mysql result into BigQuery将 mysql 结果输入 BigQuery 的最快方法
【发布时间】:2017-09-30 04:58:44
【问题描述】:

我有一个 104M 行的 mysql 表。使用streaming inserts的方法,大约需要三个小时,费用为5美元。

查询或复制 mysql 表并将其放入 BQ 的最快方法是什么?例如,有没有办法将 mysql 数据库(不在 GCP 上)直接流式传输到 GCS 上的 csv 文件中,然后从 BQ 加载 csv 文件?我们注意到loading csv files from GCS into BQ 非常快。

以最快的方式将数据从外部 mysql 表(或任何外部数据库,实际上)获取到 BQ 的建议方法是什么?


更新:请注意,我们并没有尝试通过增量馈送来减少数据大小(我们已经这样做了)。这个问题只是问从外部数据库将 100M 行数据(比如说 15GB)获取到 BQ 中的绝对最快的方法是什么。

【问题讨论】:

  • 我从来没有做过,但我想最快的方法是将表格导出为 CSV,然后上传到 GCS。您也可以使用 Cloud Dataflow,并编写一个自定义接收器来与 MySQL 通信,但这可能不值得。
  • @GrahamPolley 关于如何/为什么比直接流式插入更快的任何基准?
  • 没有。流式传输会更快,但请记住,您必须为流式插入付费。您还需要通过流式处理指数式退避和重试。

标签: mysql google-bigquery


【解决方案1】:

有一系列博文是 WePay 展示了他们实现这一目标的方式:

MySQL 到 GCS 运算符对 MySQL 执行 SELECT 查询 桌子。 SELECT 提取所有大于(或等于)最后一个的数据 高水印。高水位线要么是主键 表(如果表是仅附加的),或修改时间戳 列(如果表接收更新)。同样,SELECT 语句 还可以回溯一点时间(或行)以捕获可能丢弃的 上次查询中的行(由于上述问题)。

借助 Airflow,他们设法使 BigQuery 每 15 分钟与他们的 MySQL 数据库同步一次。


附录(因为问题想知道将行插入 BigQuery 的最快方法):

  • 流式插入是将数据导入 BigQuery 的最快方式,但每秒有 100,000 行的限制。以这种速度,100M 行至少需要 100 秒。

  • bq load GCS 中的文件(json、csv、avro)通常是免费批量导入数据的最快方式。

  • 尝试联合查询:将您的 (json, csv, avro) 文件放入 GCS,而不是运行传统的导入 - 直接从 GCS 查询数据。这应该比bq load 更快(无需等待加载调度程序),您可以将SELECT * 的结果输出到新的BQ 本机表。其成本将是查询的成本(扫描字节)。

【讨论】:

  • 嗨 Felipe,感谢您的回答。我们已经在进行完全刷新和增量刷新,所以上面的内容并不是我们想要找到的。基本上,如果我们在 mysql 数据库中有 1M 行,那么将这些数据导入 BQ 的最快方法是什么? (不是如何减少查询本身的大小——把它当作给定的。)
  • 哦,我明白了 - 我添加了一些想法
  • > 流式插入是将数据导入 BigQuery @FelipeHoffa 的最快方式 - 您是说流式传输比从 GCS 加载更快吗?
  • @FelipeHoffa 感谢您的更新——有什么方法可以对 1M 传输到 BQ 进行基准测试?即对于非GCP数据库的1M行,以上三者如何及时执行?
  • @FelipeHoffa 在对此进行基准测试后,我们发现保存到 csv 并加载 csv 文件比流式插入要快得多——在我们的用例中大约快 8.5 倍。我们只能在流式操作中实现约 10K/秒的操作(不管我们使用的线程数量等)——我们确实有很多字符串字段,所以这可能与较慢的吞吐量有关。跨度>
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 2022-07-06
  • 2016-07-25
  • 1970-01-01
相关资源
最近更新 更多