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

Posted

技术标签:

【中文标题】从 Azure Synapse Analytics Spark Pool 连接到 Azure SQL 数据库【英文标题】:Connecting from Azure Synapse Analytics Spark Pool to Azure SQL Database 【发布时间】:2021-06-10 07:21:09 【问题描述】:

是否有人幸运地将 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 令牌以及一些未知字符的内容。这不是连接字符串。

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

【问题讨论】:

我最近使用 SQL 登录完成了这项工作 - 看看这里:***.com/a/66546617/1527504 SQL 登录应该没问题。有一个开放的请求来添加有关如何在 SQL 中使用令牌库的文档,因为正如您所注意到的,它没有按预期工作:github.com/MicrosoftDocs/azure-docs/issues/72077 是的,我已经打开了那张票;-) 我不想使用 SQL 用户,而是使用 AAD 和托管标识。让我们看看 MS 方面会发生什么。 嗨@PiotrGwiazda,你有什么进展吗? 我们希望将 JDBC 用于 AAD 而不是 SQL 登录,但将凭据存储在 KV 中。 MS 还没有回复。 【参考方案1】:

只是为了更新 @mateharu 的答案,截至 2021 年 12 月,以下在 Synapse 中“开箱即用”的作品:

sql_server_name = "SOMETHING"
db_port = 1433
db_table = "SOMETHING"
db_name = "SOMETHING"
linked_service_name = "LINKEDSERVICENAME"

access_token = mssparkutils.credentials.getConnectionStringOrCreds(linked_service_name)

# Write
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", access_token) \
    .option("encrypt", "true") \
    .option("databaseName", db_name) \
    .option("hostNameInCertificate", "*.database.windows.net") \
    .mode("append") \
    .save()

# Read
df2 = spark.read.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", access_token) \
    .option("encrypt", "true") \
    .option("databaseName", db_name) \
    .option("hostNameInCertificate", "*.database.windows.net") \
    .load()

【讨论】:

【参考方案2】:

TokenLibrary.getConnectionString("MyAzureSQLDev") 返回工作区身份 (MSI) 的访问令牌。为了使用令牌并写入数据库,我将sql-spark-connector 上传到工作区包并编写了以下代码:

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()

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

CREATE USER [your workspace identity] FROM EXTERNAL PROVIDER;

但是...

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

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

【讨论】:

很好的回答伙伴。您能在以下方面提供帮助吗?***.com/questions/67329558/…

以上是关于从 Azure Synapse Analytics Spark Pool 连接到 Azure SQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

创建从 Crystal Reports 到 Azure Synapse Analytics 的服务主体连接

Azure Synapse Analytics 是不是支持 R 语言?

从 Databricks 到 Azure Synapse Analytics:当我们将数据帧加载到表中时,为啥需要将 parquet.writeLegacyFormat 设置为 True?

Azure Synapse Analytics 版本控制

SqlServerRegionDoesNotAllowProvisioning:无法创建 Azure Synapse Analytics 工作区

Azure Synapse Analytics监控行组跳转。