Google compute engine 使用数据流从计算引擎读取数据
我想在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)(类型=主机):连接超时)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
可以给我一些想法,谢谢。要限制它,以便只有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"