在Google Dataflow上使用JdbcIO,吞吐量非常低

时间:2017-06-28 11:24:36

标签: sql google-cloud-platform google-cloud-sql google-cloud-dataflow apache-beam

我想通过Google Dataflow将数据加载到Google CloudSQL实例中。 我认为没有针对CloudSQL的内置Sink,我决定使用org.apache.beam.sdk.io.jdbc.JdbcIO。 但是,CloudSQL的吞吐量非常低(约6个记录/秒)。

我怀疑CloudSQL的规格太差了,但升级时没有改进。

在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. 

发生了什么?我怎样才能提高性能?

2 个答案:

答案 0 :(得分: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时才有效。

答案 1 :(得分:0)

  

拒绝拆分请求,因为自定义读取器返回了null残差   源。

您实施的任何自定义来源似乎都不支持动态重新平衡。

  

我怀疑CloudSQL的规格太差了,但是没有   在升级时改进。

您确定Cloud SQL的吞吐量是个问题。您是否测量过源的性能并证明它是瓶颈?

  

我想通过Google将数据加载到Google CloudSQL实例中   数据流

一般来说,我不推荐这个。 Cloud SQL是一个单机数据库,所以我怀疑你没有获得很多好处,也许它甚至可以通过使用像Dataflow这样的水平可伸缩方法来表现性能。您应该能够像使用单个VM实例一样快速地加载到Cloud SQL中来加载数据。