无法使用 jdbc 和 spark 连接器从 databricks 集群连接到 Azure 数据库 for MySQL 服务器

Posted

技术标签:

【中文标题】无法使用 jdbc 和 spark 连接器从 databricks 集群连接到 Azure 数据库 for MySQL 服务器【英文标题】:Not able to connect to Azure database for MySQL server from databricks cluster using jdbc and spark connector 【发布时间】:2020-05-22 02:30:00 【问题描述】:

我正在尝试使用 databricks 集群连接到 mysql 服务器的 Azure 数据库。 我尝试使用下面描述的 2 种方法-

    使用 jdbc

    val jdbcHostname = "<serverName>.mysql.database.azure.com"
    val jdbcPort = 3306
    val jdbcDatabase = "<db>"
    val jdbcUrl = s"jdbc:mysql://$jdbcHostname:$jdbcPort/$jdbcDatabase?useSSL=true&requireSSL=false"
    
    import java.sql.DriverManager
    val connection = DriverManager.getConnection(jdbcUrl, "<user>@<serverName>", "<password>")
    

但我收到错误消息 "Client with IP address 'SOME_IP_ADDRESS' is not allowed to connect to this MySQL server"

我将此 ip 添加到 MySQL 服务器的 Azure 数据库的防火墙规则中,然后就可以访问了。但是每次集群重新启动时,IP地址都会发生变化并引发错误。 我不想在 mySQL 服务器中使用 "Allow access to Azure services",因为它也允许来自另一个订阅的用户。

    使用 Spark 连接器 - 下载“com.microsoft.azure:azure-sqldb-spark:1.0.2”jar

    val config = Config(Map(
    "driver"         -> "org.mariadb.jdbc.Driver",
    "url"            -> "<serverName>.mysql.database.azure.com:3306",
    "databaseName"   -> "<db>",
    "dbTable"        -> "<dbtable>",
    "user"           -> "<user>@<serverName>",
    "password"       -> "<password>"
    ))
    val data = spark.read.sqlDB(config)
    

但它会抛出错误说 "java.lang.IllegalArgumentException: requirement failed: The driver could not open a JDBC connection. Check the URL: jdbc:sqlserver://&lt;serverName&gt;.mysql.database.azure.com:3306"

我也试过这种方式-

    val df = spark.read.format("jdbc").option("driver", "org.mariadb.jdbc.Driver")
   .option("url", "jdbc:mysql://<serverName>.mysql.database.azure.com:3306/<db>?useSSL=true&requireSSL=false")
   .option("databaseName", "<db>")
   .option("dbTable", "<dbtable>")
   .option("user", "<user>@<serverName>")
   .option("password", "<password>")
   .load()

但它也会引发错误 "Client with IP address 'SOME_IP_ADDRESS' is not allowed to connect to this MySQL server"

【问题讨论】:

据我所知,spark连接器只支持azure SQL数据库和sql server。它不支持mysql。更多详情请参考docs.microsoft.com/en-us/azure/databricks/data/data-sources/… 嗨 Sonali Sharma,如果答案对您有帮助,请接受(标记)它作为答案。这对其他社区成员可能是有益的。谢谢。 【参考方案1】:

Azure Databricks 中不支持将用于 MySQL 的 Azure SQL 数据库作为数据源。它不在列表中。

请参考:Data sources for Azure Databricks和@Jim Xu为您提供的文档。

希望这会有所帮助。

【讨论】:

以上是关于无法使用 jdbc 和 spark 连接器从 databricks 集群连接到 Azure 数据库 for MySQL 服务器的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark SQL 中使用 Presto JDBC 时无法识别的连接属性“url”

使用 Dataframes 从 Informix 到 Spark 的 JDBC

如何使用Spark执行MySQL(JDBC)连接?

从 JDBC 连接读取时如何使用谓词?

Spark 无法从 SBT 找到 JDBC 驱动程序

第八篇|Spark SQL百万级数据批量读写入MySQL