到 Bigquery 的数据流 Mysql:连接被拒绝
Dataflow Mysql to Bigquery: Connection refused
我正在尝试通过 Dataflow 作业将数据从本地 Mysql 提取到 Bigquery,但无法连接和获取数据。有人遇到过类似的问题吗?
这是我使用的代码
gcloud dataflow jobs run mariadb_to_bigquery --gcs-location
gs://dataflow-templates/latest/Jdbc_to_BigQuery
--parameters=driverJars=gs://xxxxxx-xxxxx/mysql-connector-java-8.0.17.jar,driverClassName=com.mysql.jdbc.Driver,connectionURL='jdbc:mysql://127.0.0.1:3306/classicmodels?user=root&password=xxxxx',query='select
* from customers',outputTable=xxxxxx-xxxxx-******:ds010.customers,bigQueryLoadingTemporaryDirectory=gs://xxxxxx-xxxxx-******/my-files/temp-dir
java.lang.RuntimeException: org.apache.beam.sdk.util.UserCodeException: java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:817)
... 38 more
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:204)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65)
... 41 more
Thanks,
Srikanth
编辑:我的一个队友强烈推荐使用 VPC 网络方法,因为暴露外部 mySQL 端点会使数据库面临 DDOS 和暴力登录攻击的风险。
由于数据流作业在 GCE VM 实例上运行,因此它与您使用 localhost/127.0.0.1 连接到的 JDBC 端点不在同一台机器上。
私有 IP over VPC 网络方法
设置 a VPC network, and use a private IP on the VPC network to connect to the JDBC instance, Instead of using the external IP address of your JDBC instance on a separate network. See: VPC Network Peering or Cloud VPN.
您可能需要 a firewall rule as well,以允许您与 GCP 网络的对等网络上的流量。
启动模板时指定 --network name 参数。
gcloud dataflow jobs run <job_name> --gcs-location <template_location>
--parameters=network=<my_network>,param2=<value>,...
外部 IP 方法(不推荐,因为存在 DDOS 和暴力破解风险)您需要提供一个外部 IP 地址,并且:
- create a custom network 并为其命名。
- Define a firewall rule to allow egress TCP connections to your specific port on an external host,用于数据流 VM 标记。
gcloud compute firewall-rules create vm1-allow-egress-tcp-port3306-to-192-0-2-5 \
--network my-network \
--action allow \
--direction egress \
--rules tcp:3306 \
--destination-ranges 192.0.2.5/32 \
--priority 70 \
--target-tags dataflow
- 启动模板时指定 --network name 参数。
gcloud dataflow jobs run <job_name> --gcs-location <template_location>
--parameters=network=<my_network>,param2=<value>,...
您可能需要使用 subnet calculator 来正确计算目的地范围
- 您可能同样需要配置您的 mySQL 实例或网络以允许此连接。
此外,在与数据流实例相同的网络上创建虚拟机可能更简单,ssh 并尝试使用小型 JDBC java 程序测试 jdbc 连接,在 运行 整个数据流程序之前。更快地排除故障。
我正在尝试通过 Dataflow 作业将数据从本地 Mysql 提取到 Bigquery,但无法连接和获取数据。有人遇到过类似的问题吗?
这是我使用的代码
gcloud dataflow jobs run mariadb_to_bigquery --gcs-location gs://dataflow-templates/latest/Jdbc_to_BigQuery --parameters=driverJars=gs://xxxxxx-xxxxx/mysql-connector-java-8.0.17.jar,driverClassName=com.mysql.jdbc.Driver,connectionURL='jdbc:mysql://127.0.0.1:3306/classicmodels?user=root&password=xxxxx',query='select * from customers',outputTable=xxxxxx-xxxxx-******:ds010.customers,bigQueryLoadingTemporaryDirectory=gs://xxxxxx-xxxxx-******/my-files/temp-dir
java.lang.RuntimeException: org.apache.beam.sdk.util.UserCodeException: java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:817)
... 38 more
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:204)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65)
... 41 more
Thanks,
Srikanth
编辑:我的一个队友强烈推荐使用 VPC 网络方法,因为暴露外部 mySQL 端点会使数据库面临 DDOS 和暴力登录攻击的风险。
由于数据流作业在 GCE VM 实例上运行,因此它与您使用 localhost/127.0.0.1 连接到的 JDBC 端点不在同一台机器上。
私有 IP over VPC 网络方法
设置 a VPC network, and use a private IP on the VPC network to connect to the JDBC instance, Instead of using the external IP address of your JDBC instance on a separate network. See: VPC Network Peering or Cloud VPN.
您可能需要 a firewall rule as well,以允许您与 GCP 网络的对等网络上的流量。
启动模板时指定 --network name 参数。
gcloud dataflow jobs run <job_name> --gcs-location <template_location> --parameters=network=<my_network>,param2=<value>,...
外部 IP 方法(不推荐,因为存在 DDOS 和暴力破解风险)您需要提供一个外部 IP 地址,并且:
- create a custom network 并为其命名。
- Define a firewall rule to allow egress TCP connections to your specific port on an external host,用于数据流 VM 标记。
gcloud compute firewall-rules create vm1-allow-egress-tcp-port3306-to-192-0-2-5 \ --network my-network \ --action allow \ --direction egress \ --rules tcp:3306 \ --destination-ranges 192.0.2.5/32 \ --priority 70 \ --target-tags dataflow
- 启动模板时指定 --network name 参数。
gcloud dataflow jobs run <job_name> --gcs-location <template_location> --parameters=network=<my_network>,param2=<value>,...
您可能需要使用 subnet calculator 来正确计算目的地范围
- 您可能同样需要配置您的 mySQL 实例或网络以允许此连接。
此外,在与数据流实例相同的网络上创建虚拟机可能更简单,ssh 并尝试使用小型 JDBC java 程序测试 jdbc 连接,在 运行 整个数据流程序之前。更快地排除故障。