我正在尝试通过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的格式错误,并将其显示为3306? (我尝试显式提供端口,但这没有帮助...
答案 0 :(得分:1)
我按照您共享的教程中的说明进行操作,并且创建了Cloud SQL实例和Dataproc Cluster。验证过程也已执行:
$ 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密码,然后再从主服务器中尝试以下命令吗?
mysql -u root -h 127.0.0.1 -p
在我的环境中,以上命令成功连接。如果可行,请检查this link以获得连接Java应用程序的进一步步骤。作为附加步骤,需要身份验证和连接器mysql-connector-java。
希望有帮助!
答案 1 :(得分:0)
我遇到了同样的问题,症状完全相同(在 localhost
而不是 cloudsqlproxy~*
和 google:3,306
上拒绝访问)。
SSH 进入并查看 /var/log/cloud-sql-proxy/cloud-sql-proxy.log
,我看到 cloud-sql-proxy 实际上并未启动;由于某种原因,端口 3306 显然已经在使用中。我在 =tcp:3307
中的实例连接名称末尾添加了 additional-cloud-sql-instances
,然后就可以正常运行了。
我从来没有设法让 SocketFactory URI 工作。如果更改端口不起作用,其他地方的其他人建议使用 VPC。