Ошибки токена (доступа) при подключении к MS SQL Server из блокнотов Python DataBricks через драйвер JDBC PySPark с использованием субъекта службы Azure и MSAL

Как устранить ошибки токена (доступ к 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, но я получаю ошибки токенов с любой из этих библиотек. Как правильно осуществить это соединение?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение подробно описано как в документации 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 ненадежна для этой цели.

Другие вопросы по теме