【问题标题】:Dataflow Mysql to Bigquery: Connection refused数据流 Mysql 到 Bigquery:连接被拒绝
【发布时间】:2019-07-28 15:45:51
【问题描述】:

我正在尝试通过 Dataflow 作业将数据从本地 Mysql 摄取到 Bigquery,但它无法连接和获取数据。有没有人遇到过类似的问题?

这是我使用的代码

gcloud 数据流作业运行 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='选择 * 来自客户的,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

【问题讨论】:

  • 您确定在 MySQL 数据库所在的任何地方都打开了正确的端口吗?您可以从它所在的网络外部连接到它吗?您是否在数据库中为数据流作业来自的 IP 授予了正确的权限? (给定“%”权限,和/或找出 IP 是什么并将其专门用于 Dataflow 的白名单)

标签: mysql jdbc google-cloud-platform google-cloud-dataflow


【解决方案1】:

编辑:我的一个队友强烈建议使用 VPC 网络方法,因为暴露外部 mySQL 端点会使数据库面临 DDOS 和暴力登录攻击的风险。

由于 Dataflow 作业在 GCE 虚拟机实例上运行,它与您使用 localhost/127.0.0.1 连接的 JDBC 端点不在同一台机器上。

私有 IP over VPC 网络方法

  1. 设置 a VPC network,并使用 VPC 网络上的私有 IP 连接到 JDBC 实例,而不是使用单独网络上的 JDBC 实例的外部 IP 地址。请参阅:VPC Network PeeringCloud VPN

  2. 您可能需要 a firewall rule as well,以允许您的对等网络上的流量与 GCP 网络。

  3. 在启动模板时指定 --network name 参数。

gcloud dataflow jobs run <job_name> --gcs-location <template_location>
--parameters=network=<my_network>,param2=<value>,...

外部 IP 方法(由于 DDOS 和暴力破解风险,不推荐)您需要提供外部 IP 地址,并且:

  1. create a custom network 并为其命名。
  2. 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
  1. 在启动模板时指定 --network name 参数。
gcloud dataflow jobs run <job_name> --gcs-location <template_location>
--parameters=network=<my_network>,param2=<value>,...

您可能希望使用subnet calculator 正确计算目标范围

  1. 您可能同样需要配置您的 mySQL 实例或网络以允许此连接。

此外,在运行整个数据流程序之前,在与数据流实例相同的网络上创建虚拟机(ssh)并尝试使用小型 JDBC Java 程序测试 jdbc 连接性可能更简单。更快地排除故障。

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 1970-01-01
    • 2019-11-07
    • 2022-09-27
    • 2021-03-16
    • 2020-01-19
    • 1970-01-01
    • 2017-08-08
    • 2013-04-22
    相关资源
    最近更新 更多