Google compute engine 使用数据流从计算引擎读取数据

Google compute engine 使用数据流从计算引擎读取数据,google-compute-engine,google-cloud-dataflow,Google Compute Engine,Google Cloud Dataflow,我想在Google Compute Engine上从MariaDB读取数据,并通过DataFlow将数据写入BigQuery,但当我在DataFlowRunner上运行DataFlow程序时,总是会出现如下异常 java.lang.RuntimeException:org.apache.beam.sdk.util.UserCodeException:java.sql.SQLException:无法创建PoolableConnectionFactory(无法连接到地址=(主机=xxx.xxx.xx

我想在Google Compute Engine上从MariaDB读取数据,并通过DataFlow将数据写入BigQuery,但当我在DataFlowRunner上运行DataFlow程序时,总是会出现如下异常

java.lang.RuntimeException:org.apache.beam.sdk.util.UserCodeException:java.sql.SQLException:无法创建PoolableConnectionFactory(无法连接到地址=(主机=xxx.xxx.xxx.xxx)(端口=3306)(类型=主机):连接超时)

  • 我可以通过DBeaver成功访问MariaDB
  • 我可以在DirectRunner上成功运行数据流程序

  • 可以给我一些想法,谢谢。

    要限制它,以便只有Dataflow作业可以访问它,您可以利用Dataflow的线束VM是使用
    Dataflow
    标记创建的这一事实。否则,您可以在特定网络/子网络上分配GCE实例和DF工作者

    例如,创建一个带有网络标签(如
    mariadb
    )的GCE实例,以便将其用作将防火墙规则应用于和/或选择特定VPC网络/子网络的目标。安装MariaDB(另一个选项是通过CloudLauncher使用初始化脚本或预安装的解决方案)

    对于防火墙规则,您需要在端口
    tcp:3306
    上访问数据库。对于GCE实例(目标标签
    mariadb
    ),您需要允许来自源标签
    dataflow
    或来自上述端口上的子网内的流量进入。考虑到这一点,对于后一个选项,您还需要允许子网内DF工作者之间的内部通信

    现在,在数据流端,将
    JdbcIO
    mariadb
    连接器依赖项添加到
    pom.xml
    文件中:

    <!-- https://mvnrepository.com/artifact/org.apache.beam/beam-sdks-java-io-jdbc -->
    <dependency>
        <groupId>org.apache.beam</groupId>
        <artifactId>beam-sdks-java-io-jdbc</artifactId>
        <version>2.3.0</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
    <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
        <version>1.1.7</version>
    </dependency>
    

    要限制它,以便只有Dataflow作业可以访问它,您可以利用Dataflow的线束VM是使用
    Dataflow
    标记创建的这一事实。否则,您可以在特定网络/子网络上分配GCE实例和DF工作者

    例如,创建一个带有网络标签(如
    mariadb
    )的GCE实例,以便将其用作将防火墙规则应用于和/或选择特定VPC网络/子网络的目标。安装MariaDB(另一个选项是通过CloudLauncher使用初始化脚本或预安装的解决方案)

    对于防火墙规则,您需要在端口
    tcp:3306
    上访问数据库。对于GCE实例(目标标签
    mariadb
    ),您需要允许来自源标签
    dataflow
    或来自上述端口上的子网内的流量进入。考虑到这一点,对于后一个选项,您还需要允许子网内DF工作者之间的内部通信

    现在,在数据流端,将
    JdbcIO
    mariadb
    连接器依赖项添加到
    pom.xml
    文件中:

    <!-- https://mvnrepository.com/artifact/org.apache.beam/beam-sdks-java-io-jdbc -->
    <dependency>
        <groupId>org.apache.beam</groupId>
        <artifactId>beam-sdks-java-io-jdbc</artifactId>
        <version>2.3.0</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
    <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
        <version>1.1.7</version>
    </dependency>
    

    你能提供更多的信息吗?例如,完全异常和您尝试运行的命令行等?嗨,Lara,感谢您的响应,我们找到了原因-防火墙配置。另一个问题,我们如何设置防火墙规则,以允许数据流的作业在计算引擎上访问数据库,从而提高安全性。数据库在其他计算引擎上运行?我认为您需要允许访问运行数据流作业的服务帐户才能访问该资源。嗨,劳拉,谢谢。是的,我们的数据源是一个计算引擎上的MySQL,我们使用DataFlow读取数据,然后将数据写入BigQuery,GCE和DataFlow都在同一个项目下。1) 我们能否将VPC网络应用于GCE和数据流,以允许数据流访问GCE?现在我们尝试使用这种方法。2) 您的意思是让我们的GCE只能通过服务帐户访问吗?3) 我找不到包含如何在数据流中实现服务帐户示例代码的文档。我们将使用气流来管理数据流。我们的beam版本是2.3.0。在数据流中使用服务帐户和内部IP以及服务帐户的防火墙规则解决了这个问题,谢谢。您能提供更多信息吗?例如,完全异常和您尝试运行的命令行等?嗨,Lara,感谢您的响应,我们找到了原因-防火墙配置。另一个问题,我们如何设置防火墙规则,以允许数据流的作业在计算引擎上访问数据库,从而提高安全性。数据库在其他计算引擎上运行?我认为您需要允许访问运行数据流作业的服务帐户才能访问该资源。嗨,劳拉,谢谢。是的,我们的数据源是一个计算引擎上的MySQL,我们使用DataFlow读取数据,然后将数据写入BigQuery,GCE和DataFlow都在同一个项目下。1) 我们能否将VPC网络应用于GCE和数据流,以允许数据流访问GCE?现在我们尝试使用这种方法。2) 您的意思是让我们的GCE只能通过服务帐户访问吗?3) 我找不到包含如何在数据流中实现服务帐户示例代码的文档。我们将使用气流来管理数据流。我们的beam版本是2.3.0。在数据流中使用服务帐户和内部IP以及服务帐户的防火墙规则解决了这个问题,谢谢。非常感谢您的完整回答,这非常有用。我们将实现这一点。非常感谢您的完整答案,它是有用的。我们将落实这一点。
    mvn compile exec:java \
          -Dexec.mainClass=com.example.MariaDB \
          -Dexec.args="--project=PROJECT_ID \
          --stagingLocation=gs://BUCKET_NAME/mariadb/staging/ \
          --output=gs://BUCKET_NAME/mariadb/output \
          --network="dataflow-network" \
          --subnetwork="regions/europe-west1/subnetworks/subnet-europe-west" \
          --zone="europe-west1" \
          --runner=DataflowRunner"