可以通过SSH隧道使用Apache Beam jdbcIO吗?
我需要通过ssh隧道从Mysql服务器获取数据。 我在Google Dataflow上使用ApacheBeam 2.19.0 Java JdbcIO连接到数据库。 但是,由于数据库位于专用网络中,我需要通过ssh隧道通过ssh服务器之间的一个服务器访问数据库可以通过SSH隧道使用Apache Beam jdbcIO吗?,jdbc,google-cloud-dataflow,apache-beam,ssh-tunnel,apache-beam-io,Jdbc,Google Cloud Dataflow,Apache Beam,Ssh Tunnel,Apache Beam Io,我需要通过ssh隧道从Mysql服务器获取数据。 我在Google Dataflow上使用ApacheBeam 2.19.0 Java JdbcIO连接到数据库。 但是,由于数据库位于专用网络中,我需要通过ssh隧道通过ssh服务器之间的一个服务器访问数据库 使用ApacheBeam JDBCIO是否可以实现 此功能没有内置到Apache Beam中,但是有几个选项。JdbcIO使用标准Java JDBC接口连接到数据库。在连接之前,用您自己的包装器设置SSH隧道来重载Mysql JDBC驱动程
使用ApacheBeam JDBCIO是否可以实现 此功能没有内置到Apache Beam中,但是有几个选项。JdbcIO使用标准Java JDBC接口连接到数据库。在连接之前,用您自己的包装器设置SSH隧道来重载Mysql JDBC驱动程序并不太困难。我在Google上快速搜索了一下,发现了一个项目,它使用SSHJ将任意JDBC驱动程序包装成一个SSH隧道:(副本以com.cekrlic:JDBC SSHJ:0.1.0的形式发布到maven)。项目看起来有点不明确,但它会做你想做的事情。将其添加到运行时依赖项中,然后将配置更新为类似以下内容(此示例不安全):
pipeline.apply(JdbcIO.read())
.withDataSourceConfiguration(JdbcIO.DataSourceConfiguration.create(
“com.cekrlic.jdbc.ssh.tunnel.SshJDriver”,
“jdbc:sshj://sshbastion?remote=database:3306&username=sshuser&password=sshpassword&verify_hosts=offjdbc:mysql://localhost:3306/mydb")
.username(“用户名”)
.withPassword(“密码”))
.withQuery(“从人员中选择id、姓名”)
.withCoder(KvCoder.of(bigendiaintegercoder.of(),StringUtf8Coder.of())
.withRowMapper(新的JdbcIO.RowMapper(){
public KV mapRow(ResultSet ResultSet)引发异常{
返回KV.of(resultSet.getInt(1),resultSet.getString(2));
}
})
);
如果您使用的是数据流,您可以设置一个GCE虚拟机作为网关。在该虚拟机上,使用SSH转发将数据库隧道到虚拟机的外部接口(
SSH-R\*:3306:Database:3306 sshbastion
),使端口在VPC内可用,然后运行数据流作业。如果您的数据库已经在GCP中运行,您可以使用此方法在与数据库相同的VPC上运行数据流作业,并放弃SSH步骤。您好,请提供有关网关GCE设置的更多信息?您的命令中的sshbastion是什么?我对你解决这个问题的方法很感兴趣:
pipeline.apply(JdbcIO.<KV<Integer, String>>read()
.withDataSourceConfiguration(JdbcIO.DataSourceConfiguration.create(
"com.cekrlic.jdbc.ssh.tunnel.SshJDriver",
"jdbc:sshj://sshbastion?remote=database:3306&username=sshuser&password=sshpassword&verify_hosts=off;;;jdbc:mysql://localhost:3306/mydb")
.username("username")
.withPassword("password"))
.withQuery("select id,name from Person")
.withCoder(KvCoder.of(BigEndianIntegerCoder.of(), StringUtf8Coder.of()))
.withRowMapper(new JdbcIO.RowMapper<KV<Integer, String>>() {
public KV<Integer, String> mapRow(ResultSet resultSet) throws Exception {
return KV.of(resultSet.getInt(1), resultSet.getString(2));
}
})
);