【发布时间】:2017-11-25 17:56:27
【问题描述】:
我正在努力将 JdbcIO 与 Apache Beam 2.0 (Java) 一起使用,以从同一项目中的 Dataflow 连接到 Cloud SQL 实例。
我收到以下错误:
java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)
根据文档,如果数据流服务帐户 *@dataflow-service-producer-prod.iam.gserviceaccount.com 拥有“编辑”权限,他应该有权访问同一项目中的所有资源。
当我使用 DirectRunner 运行相同的 Dataflow 作业时,一切正常。
这是我正在使用的代码:
private static String JDBC_URL = "jdbc:mysql://myip:3306/mydb?verifyServerCertificate=false&useSSL=true";
PCollection < KV < String, Double >> exchangeRates = p.apply(JdbcIO. < KV < String, Double >> read()
.withDataSourceConfiguration(JdbcIO.DataSourceConfiguration.create("com.mysql.jdbc.Driver", JDBC_URL)
.withUsername(JDBC_USER).withPassword(JDBC_PW))
.withQuery(
"SELECT CurrencyCode, ExchangeRate FROM mydb.mytable")
.withCoder(KvCoder.of(StringUtf8Coder.of(), DoubleCoder.of()))
.withRowMapper(new JdbcIO.RowMapper < KV < String, Double >> () {
public KV < String, Double > mapRow(ResultSet resultSet) throws Exception {
return KV.of(resultSet.getString(1), resultSet.getDouble(2));
}
}));
编辑:
在另一个数据流作业中在梁之外使用以下方法似乎可以与 DataflowRunner 一起正常工作,这告诉我数据库可能不是问题。
java.sql.Connection connection = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PW);
【问题讨论】:
标签: google-cloud-sql google-cloud-dataflow apache-beam