使用服务主体从 DataBricks 连接到 Synapse

Posted

技术标签:

【中文标题】使用服务主体从 DataBricks 连接到 Synapse【英文标题】:Connect to Synapse from DataBricks using Service Principal 【发布时间】:2020-10-15 23:50:28 【问题描述】:

我正在尝试使用服务主体从 Databricks 连接到 Synapse。 我已经在集群配置中配置了服务主体

fs.azure.account.auth.type.<datalake>.dfs.core.windows.net OAuth
fs.azure.account.oauth.provider.type org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
fs.azure.account.oauth2.client.id <Service Principal ID/Application ID>
fs.azure.account.oauth2.client.secret <Client secret key/Service Principal Password>
fs.azure.account.oauth2.client.endpoint https://login.microsoftonline.com/<tenant-id>/oauth2/token
fs.azure.createRemoteFileSystemDuringInitialization true

虽然我可以成功连接到 DataLake 并工作,但当我使用以下命令时,我无法写入突触...

DummyDF.write.format("com.databricks.spark.sqldw")\
.mode("append")\
.option("url", jdbcUrl)\
.option("useAzureMSI", "true")\
.option("tempDir",tempdir)\
.option("dbTable", "DummyTable").save()

我收到以下错误...

Py4JJavaError: An error occurred while calling o831.save.
: com.databricks.spark.sqldw.SqlDWSideException: SQL DW failed to execute the JDBC query produced by the connector.
Underlying SQLException(s):
com.microsoft.sqlserver.jdbc.SQLServerException: External file access failed due to internal error: 'Error occurred while accessing HDFS: Java exception raised on call to HdfsBridge_IsDirExist. Java exception message:
HdfsBridge::isDirExist - Unexpected error encountered checking whether directory exists or not: AbfsRestOperationException: Operation failed: "This request is not authorized to perform this operation using this permission.", 403, HEAD, https://datalakename.dfs.core.windows.net/temp/2020-06-24/14-21-57-819/88228292-9f00-4da0-b778-d3421ea4d2ec?upn=false&timeout=90' [ErrorCode = 105019] [SQLState = S0001]

但是我可以使用以下命令写入 Synapse...

DummyDF.write.mode("append").jdbc(jdbcUrl,"DummyTable")

我不确定缺少什么。

【问题讨论】:

【参考方案1】:

第二个选项不使用 Polybase,只通过 JDBC,速度较慢。

我认为您的错误与 Databricks 和 SQL DW 库无关,而是 Synapse 和存储之间的连接。

你能检查一下吗:

是否通过 Azure 门户在 Azure Synapse 服务器的防火墙窗格上将“允许访问 Azure 服务”设置为 ON(总体记住,如果您的 Azure Blob 存储仅限于选择虚拟网络,Azure Synapse 需要托管服务标识而不是访问权限键) 验证您是否正确指定了 tempDir,用于 blob 存储 "wasbs://" + blobContainer + "@" + blobStorage +"/tempDirs" 或*"abfss://.. ."* 适用于 ADLS Gen 2 您能否直接从 Synapse 使用托管标识为该存储创建外部表?

这是一篇介绍如何解决与您的 105019 相同的错误代码的文章: https://techcommunity.microsoft.com/t5/azure-synapse-analytics/msg-10519-when-attempting-to-access-external-table-via-polybase/ba-p/690641

【讨论】:

以上是关于使用服务主体从 DataBricks 连接到 Synapse的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 从 azure databricks notebook 连接到本地 Windows 服务器?

如何从 QlikView 连接到 Databricks Delta 表?

使用 Databricks 连接到 AWS Postgres

连接到 postgresql:dbserver db 通过 JDBC 连接到 Databricks 时连接被拒绝

是否可以通过 azure databricks 连接到无服务器 sql 池?

将 AWS S3 连接到 Databricks PySpark