【问题标题】:Very low throughput by using JdbcIO on Google Dataflow在 Google Dataflow 上使用 JdbcIO 的吞吐量非常低
【发布时间】:2017-12-01 17:38:46
【问题描述】:
我想通过 Google Dataflow 将数据加载到 Google CloudSQL 实例中。
我认为 CloudSQL 没有内置 Sink,我决定使用 org.apache.beam.sdk.io.jdbc.JdbcIO。
但是,CloudSQL 的吞吐量非常低(大约 6 条记录/秒)。
我怀疑CloudSQL的spec太差了,但是升级后没有任何改进。
Dataflow的日志中有很多日志如下:
Proposing dynamic split of work unit my-project;2017-06-27_02_58_19-14077185378147382467;6703504927792172410 at
{"fractionConsumed":0.9669782519340515}
Rejecting split request because custom reader returned null residual source.
发生了什么事?以及如何提高性能?
【问题讨论】:
标签:
sql
google-cloud-platform
google-cloud-sql
google-cloud-dataflow
apache-beam
【解决方案1】:
解决了!
在生成连接字符串时,添加如下:
JdbcIO.DataSourceConfiguration.create("com.mysql.jdbc.Driver", "jdbc:mysql://google/mydatabase?cloudSqlInstance=myproject:region:instance-name&socketFactory=com.google.cloud.sql.mysql.SocketFactory&rewriteBatchedStatements=true")
添加“rewriteBatchedStatements=true”,它的工作。
吞吐量提高到 2000/秒左右!
注意:它可能只在使用 mysql 时有效。
【解决方案2】:
拒绝拆分请求,因为自定义阅读器返回 null 残差
来源。
您实现的任何自定义源似乎都不支持动态重新平衡。
我怀疑 CloudSQL 的规范太差了,但是没有
升级后改进。
您确定 Cloud SQL 的吞吐量是问题所在吗?您是否测量了源的性能并证明它是瓶颈?
我想通过 Google 将数据加载到 Google CloudSQL 实例中
数据流
一般来说,我不会推荐这个。 Cloud SQL 是一个单机数据库,所以我怀疑通过使用像 Dataflow 这样的水平可扩展方法,您不会获得很多好处,甚至可能对性能产生负面影响。您应该能够使用单个 VM 实例加载数据以同样快的速度提取到 Cloud SQL。