从 Azure Synapse Analytics Spark Pool 连接到 Azure SQL 数据库

问题描述

是否有人幸运地从 Azure Synapse Analytics 提供的 Spark Pool 连接到 Azure sql 数据库

问题 1:

我已将 Spark sql 连接器 https://github.com/microsoft/sql-spark-connector 作为工作区库上传链接到 Spark 池。尝试启动 Spark Pool Session 时,安装它会导致错误。我收到 Livy 错误。在监视器部分,错误是:

This application Failed due to the total number of errors: 1.
Error code 1
LIBRARY_MANAGEMENT_Failed

Message
[...] Cleaning up the Spark service job because the cluster has Failed.

编辑:这实际上无缘无故地适用于另一个 Spark Pool。我不知道根本原因,但我能够在另一个池上运行它。

问题 2: 我正在尝试将 TokenLibrary 与 Azure sql 链接服务一起使用。这段代码

conn = TokenLibrary.getConnectionString("MyAzuresqlDev")
print(conn)

显示一些看起来像 Base64 加密的 JWT 令牌加上一些未知字符的东西。这不是连接字符串。

我正在寻找任何可行的解决方案。

解决方法

let temp = "http://r.rp-static.pre/r/dsn-icon?dsn=xjfhob38jg8g&size=g&v=20210314224102" console.log(temp.slice(0,temp.indexOf("&size")) + ".webp" + temp.slice(temp.indexOf("&size"))) 返回工作区标识 (MSI) 的访问令牌。为了使用令牌并写入数据库,我将 TokenLibrary.getConnectionString("MyAzureSQLDev") 上传到工作区包并编写了以下代码:

sql-spark-connector

必须以这种方式将工作区标识添加到 Azure SQL 数据库:

df.write.format("com.microsoft.sqlserver.jdbc.spark") \
    .option("url","jdbc:sqlserver://%s.database.windows.net:%d" % (sql_server_name,db_port)) \
    .option("dbtable",db_table) \
    .option("accessToken",mssparkutils.credentials.getConnectionStringOrCreds("MyAzureSQLDev")) \
    .option("encrypt","true") \
    .option("databaseName",db_name) \
    .option("hostNameInCertificate","*.database.windows.net") \
    .mode("append") \
    .save()

不过……

...当前发布的 CREATE USER [your workspace identity] FROM EXTERNAL PROVIDER; 版本(2020 年 11 月的 1.0.1 版;请参阅 here)与 Azure Synapse Analytics 使用的当前版本的 Spark 2.4 不兼容。主要问题在于 SQL Server 驱动程序的版本 - Azure Synapse 上的 Spark 2.4 提供版本 8.4.1.jre8,而 sql-spark-connector 取决于版本 7.2.1.jre8。因此,在将批量数据写入数据库时​​,在 Azure Synapse 上安装 spark-mssql-connector:1.0.1 并运行上述代码会产生 spark-mssql-connector:1.0.1

虽然 NoSuchMethodError 已经有几个月没有发布了,但它仍在积极开发中,并且在 2021 年 3 月添加了对 Azure Synapse 上的 Spark 2.4 的适当支持。我从源代码构建了最新版本并使用生成的 jar 而不是 Maven 存储库中的那个。