Как устранить ошибки токена (доступ к Active Directory) при подключении к MS SQL Server из записных книжек DataBricks Python через драйвер PySPark JDBC с использованием участника службы Azure/DataBricks и MSAL (библиотека проверки подлинности Microsoft)? Я попробовал как пакет драйверов PySpark JDBC (текущие координаты Maven: com.databricks:databricks-jdbc:2.6.25), так и соединитель Microsoft SQL (текущие координаты Maven: com.microsoft.azure:spark-mssql-connector_2.12: 1.1.0) и MSAL. Он работает с ADAL, но я получаю ошибки токенов с любой из этих библиотек. Как правильно осуществить это соединение?






Решение подробно описано как в документации Azure, так и в документации DataBricks (а также в SO), поскольку ОБА драйвер PySpark JDBC и библиотеки MS Connector необходимы для подключения записных книжек Azure DataBricks к MS SQL Server с использованием субъекта службы Active Directory через MSAL. Этот код работает (с использованием хранилищ ключей и секретов из-за ограничений соединителя доступа Azure для DataBricks и управляемого удостоверения DataBricks, которые не взаимодействуют напрямую с MS SQL Server):
# library, msal, import
import msal
##############################
# initialize, token cache
##############################
appToToken = msal.ConfidentialClientApplication(
dbutils.secrets.get(strKeyVaultName, strKeyNameServicePrincipalId),
client_credential = dbutils.secrets.get(strKeyVaultName, strKeyNameServicePrincipalValue),
authority = "https://login.microsoftonline.com/" + dbutils.secrets.get(strKeyVaultName, strKeyNameTenantId))
##############################
# token, get
##############################
resGet = appToToken.acquire_token_for_client(
scopes = ["https://database.windows.net/.default"])
# validate
if "access_token" in resGet:
##############################
# table, sql, load
##############################
dfOut = spark.read \
.format("com.microsoft.sqlserver.jdbc.spark") \
.option("url", strURLDatabasePathName) \
.option("databaseName", strDatabaseNameSQL) \
.option("dbtable", strDatabaseSchemaTableNameAP) \
.option("accessToken", resGet["access_token"]) \
.option("encrypt", "true") \
.option("hostNameInCertificate", "*.database.windows.net") \
.load()
##############################
# dataframe, write
##############################
dfOut \
.write \
.mode("overwrite") \
.saveAsTable(strTableNameFLEx)
ПРИМЕЧАНИЕ. В этом решении используется область хранилища ключей DataBricks, которая указывает на хранилище ключей Azure, где я храню идентификатор и секрет участника службы вместе с нашим идентификатором клиента Azure. Имя MS SQL Server выглядит следующим образом: «jdbc:sqlserver://[YOUR DATABASE NAME].database.windows.net»
Кроме того, я установил все три библиотеки (JDBC, MS SQL Connector и MSAL) в кластер заданий DataBricks (и/или политику вычислений), на котором работает ноутбук, поскольку волшебная установка %pip ненадежна для этой цели.