Azure Databricks : can't connect to Azure Data Lake Storage Gen2

标签 azure azure-databricks

我有存储帐户kagsa1,其中包含容器cont1,并且需要通过Databricks访问(安装)它

如果我在 KeyVault 中使用存储帐户 key ,它可以正常工作:

configs = {
    "fs.azure.account.key.kagsa1.blob.core.windows.net":dbutils.secrets.get(scope = "kv-db1", key = "storage-account-access-key")
}

dbutils.fs.mount(
  source = "wasbs://<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="71121e1f0540311a10160210405f131d1e135f121e03145f06181f151e06025f1f1405" rel="noreferrer noopener nofollow">[email protected]</a>",
  mount_point = "/mnt/cont1",
  extra_configs = configs)

dbutils.fs.ls("/mnt/cont1")

..但如果我尝试使用 Azure Active Directory 凭据进行连接:

configs = {
"fs.azure.account.auth.type": "CustomAccessToken",
"fs.azure.account.custom.token.provider.class": spark.conf.get("spark.databricks.passthrough.adls.gen2.tokenProviderClassName")
}

dbutils.fs.ls("abfss://<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="22414d4c5613624943455143130c4644510c414d50470c554b4c464d55510c4c4756" rel="noreferrer noopener nofollow">[email protected]</a>/")

..失败:

ExecutionError: An error occurred while calling z:com.databricks.backend.daemon.dbutils.FSUtils.ls.
: GET https://kagsa1.dfs.core.windows.net/cont1?resource=filesystem&maxResults=5000&timeout=90&recursive=false
StatusCode=403
StatusDescription=This request is not authorized to perform this operation using this permission.
ErrorCode=AuthorizationPermissionMismatch
ErrorMessage=This request is not authorized to perform this operation using this permission.

Databrics 工作区级别为高级,
群集启用了 Azure Data Lake 存储凭据传递选项,
存储帐户已启用分层命名空间选项,
文件系统已初始化为

spark.conf.set("fs.azure.createRemoteFileSystemDuringInitialization", "true")
dbutils.fs.ls("abfss://<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4d2e2223397c0d262c2a3e2c7c63292b3e632e223f28633a242329223a3e63232839" rel="noreferrer noopener nofollow">[email protected]</a>/")
spark.conf.set("fs.azure.createRemoteFileSystemDuringInitialization", "false")

并且我可以完全访问存储帐户中的容器: enter image description here

我做错了什么?

最佳答案

注意:执行将应用程序分配给角色中的步骤时,请确保将存储 Blob 数据贡献者角色分配给服务主体。

作为重现的一部分,我已向服务主体提供所有者权限,并尝试运行“dbutils.fs.ls("mnt/azure/") ”,返回与上面相同的错误消息。

enter image description here

现在将存储 Blob 数据贡献者角色分配给服务主体。

enter image description here

最后,在将存储 Blob 数据贡献者角色分配给服务主体后,能够获得没有任何错误消息的输出。

enter image description here

更多详情请参阅“Tutorial: Azure Data Lake Storage Gen2, Azure Databricks & Spark ”。

引用: Azure Databricks - ADLS Gen2 throws 403 error message .

关于Azure Databricks : can't connect to Azure Data Lake Storage Gen2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61100946/

相关文章:

Azure 逻辑应用 SubscriptionNotFound 错误

azure - 使用 Azure 数据工厂将多个 csv 文件复制到 Excel 的多个工作表

azure - 将字符串转换为 Azure Databricks 中的日期时间字段

azure - 应用服务内置Google身份验证

引用其他键的 Azure 应用程序配置值

c# - 使用 Azure SignalR 服务和 Azure Functions 进行本地开发

azure - 在没有错误消息的情况下,如何确定为什么在 `az fs upload` 中没有发生文件上传?

Databricks Magic Sql - 导出数据

azure - 我正在尝试直接连接到 abfss(无需安装到 DBFS)并尝试使用 databricks 中的 open() 打开 json 文件

apache-spark-sql - 如何使用 Spark sql 在 Databricks 中通过内部联接更新 Databricks Delta 表