Databricks PySpark 使用服务主体连接到 Azure SQL

问题描述 投票:0回答:1

我们想从azure databricks笔记本连接azure DB,你能帮我们提供示例吗,我看到了很多答案和故事,但我不清楚以下两点。

服务原则 ID 和秘密是什么,我应该在哪里获取它,如果我们有 AD 访问权限,我应该向我的管理员告知什么以启用此功能。

我们可以在azure门户中获取以上两点。

下面的堆栈溢出参考没有任何答案。

https://stackoverflow.com/collectives/azure/articles/75189853/how-to-connect-from-azure-databricks-to-azure-sql-db-using-service-principal

根据上面的链接,下面的代码可用,如何使用秘密凭证来使用它。

注意:我的要求是azure databricks,我们有新的作业集群,它 不是全职工作集群。我们必须在需要时使用我们的 作业集群将启动和停止。

azure pyspark azure-sql-database azure-databricks azure-cloud-services
1个回答
0
投票

感谢@数据沼泽。优秀的文档 以下方法将帮助您连接到 Azure SQL 数据库。

第1步: 您需要安装 SQL Spark Connector适用于 Python 的 Microsoft Azure Active Directory 身份验证库

在 databricks 集群中安装来自 Maven 的 com.microsoft.azure:spark-mssql-connector_2.12_3.0:1.0.0-alpha 以及来自 PyPIadal

enter image description here

在密钥保管库中,生成代表应用程序注册中的值的机密。

客户端 ID客户端密钥

为您的客户端 ID、密钥和租户 ID 创建密钥范围。 了解更多如何在databricks中创建Secretscope

第2步:在数据库中创建用户(SPN),然后授予对象权限。

CREATE USER [thedataswamp-dbr-dev] FROM  EXTERNAL PROVIDER  WITH DEFAULT_SCHEMA=[dbo]
GO
GRANT SELECT ON SCHEMA :: dbo TO [thedataswamp-dbr-dev];

表:

CREATE TABLE Emperor (
  Id INT,
  Emperor NVARCHAR(25)
)
INSERT INTO dbo.Emperor (Id, Emperor)
VALUES (1, 'Augustus'),
       (2, 'Tiberius'),
       (3, 'Caligula'),
       (4, 'Claudius'),
       (4, 'Nero');

第 3 步: 连接到 Azure SQL 数据库:

从 Key Vault 检索服务主体、机密和租户 ID。 数据库 URL、数据库和表

import adal
resource_app_id_url = "https://database.windows.net/"
service_principal_id = dbutils.secrets.get(scope = "defaultScope", key = "DatabricksSpnId")
service_principal_secret = dbutils.secrets.get(scope = "defaultScope", key = "DatabricksSpnSecret")
tenant_id = dbutils.secrets.get(scope = "defaultScope", key = "TenantId")
authority = "https://login.windows.net/" + tenant_id
azure_sql_url = "jdbc:sqlserver://thedataswamp.database.windows.net"
database_name = "dev"
db_table = "dbo.Emperor" 
encrypt = "true"
host_name_in_certificate = "*.database.windows.net"
context = adal.AuthenticationContext(authority)
token = context.acquire_token_with_client_credentials(resource_app_id_url, service_principal_id, service_principal_secret)
access_token = token["accessToken"]
emperorDf = spark.read \
             .format("com.microsoft.sqlserver.jdbc.spark") \
             .option("url", azure_sql_url) \
             .option("dbtable", db_table) \
             .option("databaseName", database_name) \
             .option("accessToken", access_token) \
             .option("encrypt", "true") \
             .option("hostNameInCertificate", "*.database.windows.net") \
             .load()
             display(emperorDf) 

enter image description here

enter image description here

  • 上述代码执行与 Azure SQL 的连接,从已注册的 Active Directory 应用程序检索身份验证令牌。
  • 下一步使用检索到的配置和身份验证令牌创建包含皇帝的 df
  • 显示包含皇帝的 df
© www.soinside.com 2019 - 2024. All rights reserved.