代码之家  ›  专栏  ›  技术社区  ›  charlesreid1

PySpark通过Dataproc+SSL连接到云SQL

  •  0
  • charlesreid1  · 技术社区  · 8 年前

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

    --ssl-ca , --ssl-cert --ssl-key

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

    我现在尝试运行一个PySpark作业,该作业连接到此云SQL实例,以提取数据进行分析。PySpark作业基本上与 this example 由谷歌云培训团队提供。在…上 line 39

    jdbcDriver = 'com.mysql.jdbc.Driver'
    jdbcUrl = 'jdbc:mysql://%s:3306/%s?user=%s&password=%s' % (CLOUDSQL_INSTANCE_IP, CLOUDSQL_DB_NAME, CLOUDSQL_USER, CLOUDSQL_PWD)
    

    残废 ,我看到以下错误消息:

    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)
    

    启用

    add a &useSSL=true or &encrypt=true but do not point to external certificates keystore 在某种特定于Java的过程中。如何修改上面链接的Python脚本中的JDBC连接字符串,以便将JDBC(通过PySpark)指向服务器证书和客户端公钥/私钥(server-ca.pem、client-cert.pem和client key.pem)在磁盘上的位置?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Dennis Huo    8 年前

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

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

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

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