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

Pio*_*zda 1 sql-server azure pyspark azure-synapse

有人幸运地从 Azure Synapse Analytics 配置的 Spark 池连接到 Azure SQL 数据库吗?

问题一:

我已将 Spark SQL 连接器https://github.com/microsoft/sql-spark-connector作为工作区库上传并链接到 Spark 池。安装此程序会在尝试启动 Spark 池会话时导致错误。我收到一个李维错误。在监视器部分中,错误是:

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.
Run Code Online (Sandbox Code Playgroud)

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

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

conn = TokenLibrary.getConnectionString("MyAzureSQLDev")
print(conn)
Run Code Online (Sandbox Code Playgroud)

显示类似 Base64 加密的 JWT 令牌以及一些未知字符的内容。这不是连接字符串。

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

mat*_*aru 5

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()
Run Code Online (Sandbox Code Playgroud)

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

CREATE USER [your workspace identity] FROM EXTERNAL PROVIDER;
Run Code Online (Sandbox Code Playgroud)

然而...

...当前发布的版本sql-spark-connector(2020 年 11 月发布的版本 1.0.1;请参阅此处)与 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 存储库。