从 Azure Synapse Analytics Spark Pool 连接到 Azure SQL 数据库
Connecting from Azure Synapse Analytics Spark Pool to Azure SQL Database
有没有人幸运地从 Azure Synapse Analytics 预配的 Spark Pool 连接到 Azure SQL 数据库?
问题一:
我已将 Spark SQL 连接器 https://github.com/microsoft/sql-spark-connector 作为工作区库上传并链接到 Spark 池。安装它会在尝试启动 Spark Pool Session 时导致错误。我收到 Livy 错误。在 Monitor 部分中,错误是:
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.
编辑:这实际上无缘无故地适用于另一个星火池。我不知道根本原因,但我能够 运行 在另一个池中做到这一点。
问题二:
我正在尝试将 TokenLibrary 与 Azure SQL 链接服务一起使用。此代码:
conn = TokenLibrary.getConnectionString("MyAzureSQLDev")
print(conn)
显示类似于 Base64 加密的 JWT 令牌以及一些未知字符的内容。这不是连接字符串。
我正在寻找任何可行的解决方案。
TokenLibrary.getConnectionString("MyAzureSQLDev")
returns 工作区身份 (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 服务器驱动程序的版本 - 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 存储库中的 jar。
只是为了更新@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()
有没有人幸运地从 Azure Synapse Analytics 预配的 Spark Pool 连接到 Azure SQL 数据库?
问题一:
我已将 Spark SQL 连接器 https://github.com/microsoft/sql-spark-connector 作为工作区库上传并链接到 Spark 池。安装它会在尝试启动 Spark Pool Session 时导致错误。我收到 Livy 错误。在 Monitor 部分中,错误是:
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.
编辑:这实际上无缘无故地适用于另一个星火池。我不知道根本原因,但我能够 运行 在另一个池中做到这一点。
问题二: 我正在尝试将 TokenLibrary 与 Azure SQL 链接服务一起使用。此代码:
conn = TokenLibrary.getConnectionString("MyAzureSQLDev")
print(conn)
显示类似于 Base64 加密的 JWT 令牌以及一些未知字符的内容。这不是连接字符串。
我正在寻找任何可行的解决方案。
TokenLibrary.getConnectionString("MyAzureSQLDev")
returns 工作区身份 (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 服务器驱动程序的版本 - 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 存储库中的 jar。
只是为了更新@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()