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

问题描述 投票:0回答:1

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

使用apache beam jdbc IO可以实现吗?

jdbc google-cloud-dataflow apache-beam ssh-tunnel apache-beam-io
1个回答
0
投票

此功能不是Apache Beam内置的,但是有几个选项。 JdbcIO使用标准的Java JDBC接口连接到数据库。在连接之前,用您自己的包装器(该包装器建立SSH隧道)重载Mysql JDBC驱动程序并不难。我在Google上进行了快速搜索,发现了一个项目,该项目使用SSHJ使用SSH隧道包装了任意JDBC驱动程序:jdbc-sshj(副本以com.cekrlic:jdbc-sshj:0.1.0的形式发布到maven)。该项目看起来有些空缺,但可以满足您的需求。将此添加到您的运行时依赖项,然后将您的配置更新为如下所示(此示例不安全):

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

如果使用的是Dataflow,则可以设置GCE VM充当网关。在该VM上,使用SSH转发将数据库传送到VM的外部接口(ssh -R \*:3306:database:3306 sshbastion),使端口在VPC内可用,然后运行数据流作业on your VPC。如果您的数据库已经在GCP中运行,则可以使用此方法在与数据库相同的VPC上运行数据流作业,并删除SSH步骤。

© www.soinside.com 2019 - 2024. All rights reserved.