我试图通过数据流工作将数据从本地MySQL摄取到BigQuery,但它无法连接和获取数据。有人遇到类似问题吗?
这是我使用的代码
gcloud dataflow作业运行mariaDB_TO_BIGQUERY-GCS-LOCATION gs://dataflow-templates/lestest/jdbc_to_bigquery -parameters = driverjars = gs://xxxxx-xxxxxx/mysql-connector-java-8.0.0.17.jar,driverclassname = com.mysql.jdbc.driver,connectionurl =/classicmodels?user = root& password = xxxxx',query ='选择 *来自客户的',outputTable = xxxxxx-xxxxx- ******:ds010.customers,bigqueryloadingTemporaryDirectory = gs://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx的
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端点会使DB处于DDOS的风险和蛮力登录攻击。
由于DataFlow作业在GCE VM实例上运行,因此它与您使用localhost/127.0.0.1的JDBC端点不在同一机器上。
VPC网络方法的私有IP
-
设置VPC网络,并在VPC网络上使用专用IP连接到JDBC实例,而不是在单独的网络上使用JDBC实例的外部IP地址。请参阅:VPC网络对等或云VPN。
-
您可能还需要一个防火墙规则,以允许使用GCP网络在同行网络上流量。
-
启动模板时指定 - 网络名称参数。
gcloud dataflow jobs run <job_name> --gcs-location <template_location> --parameters=network=<my_network>,param2=<value>,...
外部IP方法(不建议由于DDOS和Bruts Forme风险而推荐(您需要提供外部IP地址,并且:
- 创建自定义网络并给它一个名字。
- 定义防火墙规则,以允许出口TCP连接到外部主机上的特定端口,用于数据流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
- 启动模板时指定 - 网络名称参数。
gcloud dataflow jobs run <job_name> --gcs-location <template_location> --parameters=network=<my_network>,param2=<value>,...
您可能需要使用子网计算器来正确计算目标范围
- 您可能需要配置您的MySQL实例或网络以允许此连接。
此外,在运行整个数据流程序之前,在与数据流实例(SSH(上创建VM可能会更简单,并尝试使用小型JDBC Java程序来测试JDBC连接。要更快地进行故障排除。