我有一个104M行的mysql表。使用streaming inserts的方法,花费将近三个小时,花费5美元。
查询或复制mysql表并将其放入BQ的最快方法是什么?例如,有没有办法将mysql数据库(不在GCP上)直接流式传输到GCS上的csv文件中,然后从BQ加载csv文件?我们注意到loading csv files from GCS into BQ非常快。
建议的方法是以尽可能最快的方式将数据从外部mysql表(或任何外部数据库)真正地传入BQ?
更新:请注意,我们不是通过执行增量Feed(我们已经这样做)来减少数据量。这个问题只是询问从外部数据库向BQ获取100M行数据(假设为15GB)的绝对最快方法。
答案 0 :(得分:4)
有一系列的博客文章是WePay展示他们实现这一目标的方式:
MySQL to GCS运算符对MySQL执行SELECT查询 表。 SELECT拉取大于(或等于)最后一个的所有数据 高水印。高水印要么是主要的关键 table(如果表是仅附加的)或修改时间戳 列(如果表接收更新)。再次,SELECT语句 也会回溯一点时间(或行)以捕获可能丢失的 上次查询的行(由于上述问题)。
使用Airflow,他们设法每15分钟将BigQuery与MySQL数据库保持同步。
附录(因为问题想知道将行插入BigQuery的最快方法):
流式插入是将数据导入BigQuery的最快方法,但每秒限制为100,000行。 100M行至少需要100秒才能达到此速率。
bq load
GCS(json,csv,avro)中的文件通常是批量导入数据并且免费导入数据的最快方式。
尝试联合查询:将您的(json,csv,avro)文件放在GCS中,而不是直接从GCS运行传统的导入查询数据。这应该比bq load
更快(不需要等待加载调度程序),并且可以将SELECT *
的结果输出到新的BQ本机表。这笔费用将是查询费用(扫描字节数)。