PySpark通过Dataproc+SSL连接到云SQL

2024-04-28 21:02:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个在数据库中存储数据的云SQL实例,并且我已经选中了这个云SQL实例的选项来阻止所有未加密的连接。当我选择这个选项时,会给我三个SSL证书-服务器证书、客户机公钥和客户机私钥(三个单独的.pem文件)(link to relevant CloudSQL+SSL documentation)。这些证书文件用于建立到云SQL实例的加密连接。在

我能够从命令行使用MySQL成功地连接到云SQL,使用--ssl-ca--ssl-cert和{}选项分别指定服务器证书、客户端公钥和客户端私钥:

mysql -uroot -p -h <host-ip-address> \
--ssl-ca=server-ca.pem \
--ssl-cert=client-cert.pem \
--ssl-key=client-key.pem

我现在正在尝试运行一个连接到这个云SQL实例的PySpark作业来提取数据进行分析。PySpark的工作与Google云培训团队提供的this example基本相同。在上述脚本的line 39上,有一个与云SQL实例建立的JDBC连接:

^{pr2}$

但这不会建立加密连接,也不会提供三个证书文件。如果我禁用了云SQL实例的未加密连接,则会看到以下错误消息:

17/09/21 06:23:21 INFO org.spark_project.jetty.util.log: Logging initialized @5353ms
17/09/21 06:23:21 INFO org.spark_project.jetty.server.Server: jetty-9.3.z-SNAPSHOT
17/09/21 06:23:21 INFO org.spark_project.jetty.server.Server: Started @5426ms
17/09/21 06:23:21 INFO org.spark_project.jetty.server.AbstractConnector: Started ServerConnector@74af54ac{HTTP/1.1,[http/1.1]}{0.0.0.0:4040}

[...snip...]

py4j.protocol.Py4JJavaError: An error occurred while calling o51.load.
: java.sql.SQLException: Access denied for user 'root'@'<cloud-sql-instance-ip>' (using password: YES)

然而,如果我启用了云SQL实例的未加密连接,则该作业运行良好。(这表明问题不在于云SQL API权限——我运行PySpark作业的集群绝对有权访问云SQL实例。)

我发现的JDBC连接字符串涉及SSL add a ^{} or ^{} but do not point to external certificates;或者,它们在某种特定于Java的过程中使用keystore。如何修改上面链接到的Python脚本中的JDBC连接字符串,以便将JDBC(通过PySpark)指向服务器证书和客户机公钥/私钥(服务器)的位置-约pem,客户端-证书pem,和客户-密钥.pem)在磁盘上?在


Tags: 实例orginfo服务器projectsslsqlserver
1条回答
网友
1楼 · 发布于 2024-04-28 21:02:16

Dataproc集群上有一个handy initialization action for configuring the CloudSQL Proxy。默认情况下,它假定您打算将CloudSQL用于配置单元元存储,但是如果您下载它并自定义它设置ENABLE_CLOUD_SQL_METASTORE=0,然后重新将其上载到您自己的bucket中,以用作您的自定义初始化操作,那么您应该在所有节点上自动安装CloudSQL代理。然后将mysql连接字符串设置为指向localhost,而不是真正的cloudsqlip。在

指定元数据标志时,如果在元数据中禁用了additional-cloud-sql-instances而不是hive-metastore-instance

 metadata "additional-cloud-sql-instances=<PROJECT_ID>:<REGION>:<ANOTHER_INSTANCE_NAME>=tcp<PORT_#>`

在这种情况下,您可以选择使用脚本默认用于元存储的相同端口分配,即端口3306。在

相关问题 更多 >