可以通过SSH隧道使用Apache Beam jdbcIO吗?

可以通过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驱动程

我需要通过ssh隧道从Mysql服务器获取数据。 我在Google Dataflow上使用ApacheBeam 2.19.0 Java JdbcIO连接到数据库。 但是,由于数据库位于专用网络中,我需要通过ssh隧道通过ssh服务器之间的一个服务器访问数据库


使用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));
    }
  })
);