【问题标题】:Can't connect to Cloud SQL via SQL Proxy on Dataproc无法通过 Dataproc 上的 SQL 代理连接到 Cloud SQL
【发布时间】:2018-08-15 09:19:12
【问题描述】:

我正在尝试通过 Cloud SQL 代理从 Dataproc 访问 Cloud SQL(不使用 Hive)

根据此处的说明进行大量修改后: https://github.com/GoogleCloudPlatform/dataproc-initialization-actions/tree/master/cloud-sql-proxy

我已经到了至少创建集群没有错误并且似乎安装了代理的地步。但是,我的 Java Spark 作业无法连接到集群并出现以下错误:

Exception in thread "main" java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)

我故意创建了一个没有用户密码的实例,但它也不适用于有密码的实例。

我觉得奇怪的是,当我从本地计算机访问同一个数据库时,也使用本地运行的 Cloud SQL 代理,一切正常,但是当我尝试通过故意提交错误密码来强制出现类似错误时,我得到一个类似但不同的错误,如下所示:

Exception in thread "main" java.sql.SQLException: Access denied for user 'root'@'cloudsqlproxy~217.138.38.242' (using password: YES)

因此,在 Dataproc 错误中,它显示 root@localhost,而在我的本地代理中,错误显示为 root@cloudproxy~IP address。为什么要这样做?在这两个地方运行的代码完全相同。似乎它正在尝试连接到 Dataproc 主机中的本地设备?

进一步证实这一点的是,当尝试在 Dataproc 上失败时,我没有在服务器端看到此错误记录,但当我从本地计算机强制失败时,该错误已记录。所以 Dataproc 的代理似乎没有指向 SQL Server?

我按照以下说明创建了集群:

--scopes sql-admin \
--initialization-actions gs://bucket_name/cloud-sql-proxy.sh \
--metadata 'enable-cloud-sql-hive-metastore=false' \
--metadata 'additional-cloud-sql-instances=project_id:europe-west2:sql_instance_id' \

我在 Spark 代码中指定的连接字符串是这样的:

jdbc:mysql://127.0.0.1:3306/database_name

感谢您的帮助!

**** 更新:

根据以下建议,我将连接字符串修改如下:

"jdbc:mysql://google/DATABASE_NAME?cloudSqlInstance=INSTANCE_NAME&socketFactory=com.google.cloud.sql.mysql.SocketFactory&useSSL=false&user=root"

但是,在这种情况下,我收到以下错误:

Exception in thread "main" java.sql.SQLNonTransientConnectionException: Cannot connect to MySQL server on google:3,306.

Make sure that there is a MySQL server running on the machine/port you are trying to connect to and that the machine this software is running on is able to connect to this host/port (i.e. not firewalled). Also make sure that the server has not been started with the --skip-networking flag.


    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:108)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:87)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:61)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:71)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:458)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226)

应该如何/在哪里获取“google”的驱动程序?另外,请注意,它似乎对默认端口 3306 进行了错误格式化,并将其显示为 3,306? (我尝试明确提供端口,但这没有帮助......

【问题讨论】:

  • 嘿 VS_FF,您是否设法使用 Scala/Java 通过 Cloud SQL 代理从 Dataproc 访问 Cloud SQL?
  • 那是不久前的事了,但据我所知,在经历了很多痛苦之后我放弃了,并不再使用 Cloud SQL 来完成这项任务。

标签: google-cloud-sql google-cloud-dataproc


【解决方案1】:

我按照您分享的教程中的说明创建了 Cloud SQL 实例和 Dataproc 集群。验证过程也进行了:

$ gcloud dataproc jobs submit pyspark --cluster githubtest pyspark_metastore_test.py
Job [63d2e1ef8c9f45ae818c135c775dcf93] submitted.
Waiting for job output...
18/08/22 17:21:51 INFO org.spark_project.jetty.util.log: Logging initialized @3074ms
...
Successfully found table table_mdhw in Cloud SQL Hive metastore                 
18/08/22 17:22:53 INFO org.spark_project.jetty.server.AbstractConnector: Stopped Spark@5061d2ce{HTTP/1.1,[http/1.1]}{0.0.0.0:4040}
Job [63d2e1ef8c9f45ae818c135c775dcf93] finished successfully.

当我为 root 输入不同的密码时,我只得到了和你一样的错误。您可以更新 root 密码并从 master 重试以下命令吗?

 mysql -u root -h 127.0.0.1 -p

在我的环境中,上面的命令连接成功。如果可行,请查看this link 了解连接 Java 应用程序的进一步步骤。需要身份验证和连接器 mysql-connector-java 作为附加步骤。

希望对你有帮助!

【讨论】:

  • 感谢您的来信。我可以使用 mysql 控制台从 Dataproc 机器成功连接到 SQL 集群。正如我所提到的,我特意创建了没有 root 密码的 SQl 实例,以减少可能出现的错误数量,但无论有没有密码,我的问题都会出现。仍然不确定为什么它使用 root@localhost 而不是 root@sqlproxy ...
  • 使用mysql客户端我总是得到'root'@'cloudsqlproxy~35.231.7.216'。我认为java正在修改一些东西。按照建议构建连接 URL 怎么样?:jdbc:mysql://google/&lt;DATABASE_NAME&gt;?cloudSqlInstance=&lt;INSTANCE_CONNECTION_NAME&gt;&amp;socketFactory=com.google.cloud.sql.mysql.SocketFactory&amp;useSSL=false&amp;user=&lt;MYSQL_USER_NAME&gt;&amp;password=&lt;MYSQL_USER_PASSWORD&gt;
  • 让我试一试。也许这就是问题
  • 我认为您以不同的方式执行连接字符串是正确的,但在我的情况下,您建议的格式不起作用(但至少我收到一条不同的错误消息,表明它正试图超越localhost。我用新的错误消息更新了我的问题 - 欢迎任何进一步的想法!
  • 我之前分享的那个文档似乎提到了如何configure the connector。我从那里拿了连接字符串。您也可以直接找到minimal reproducible example (github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory/…),但请注意必须配置连接器,否则将无法正常工作。
【解决方案2】:

我遇到了同样的问题,症状完全相同(localhost 上的访问被拒绝,而不是 cloudsqlproxy~*google:3,306)。

SSH 进入并查看/var/log/cloud-sql-proxy/cloud-sql-proxy.log,我发现 cloud-sql-proxy 并没有真正启动;由于某种原因,端口 3306 显然已经在使用中。我在additional-cloud-sql-instances 中的实例连接名称的末尾添加了=tcp:3307,然后我就开始运行了。

我从未设法让 SocketFactory URI 工作。如果更改端口不起作用,其他地方的其他人建议使用VPC

【讨论】:

    猜你喜欢
    • 2018-06-03
    • 1970-01-01
    • 2022-11-10
    • 2021-02-12
    • 2021-08-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多