该请求无权使用该权限执行该操作

man*_*rma 6 databricks azure-databricks

我正在尝试使用以下配置在 dattabricks 中安装 adls gen2

configs = {"fs.azure.account.auth.type": "OAuth",
   "fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
   "fs.azure.account.oauth2.client.id": "service principal id",
   "fs.azure.account.oauth2.client.secret": "service principal key",
   "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/tenant-id/oauth2/token",
   "fs.azure.createRemoteFileSystemDuringInitialization": "true"}
dbutils.fs.mount(
source = "abfss://file-system@storage-account.dfs.core.windows.net/directory",
mount_point = "/mnt/data",
extra_configs = configs)
Run Code Online (Sandbox Code Playgroud)

我已创建服务主体并为其创建密钥,然后在 Active Directory 角色分配中向该服务主体提供存储 Blob 角色

根据文件

"abfss://<your-file-system-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>"
Run Code Online (Sandbox Code Playgroud)

blob 容器内的 your-file-system ==> 文件夹应该是什么?you-directory-name ==> 我在 Blob 容器内只有一个文件夹,所以这里很混乱 storgae(ADLS gen 2 Preview) Blob 容器文件夹 a.txt

错误


ExecutionError:调用 o480.mount 时发生错误。HEAD https://xxxxxxxxx.dfs.core.windows.net/xxxxxx?resource=filesystem&timeout=90 StatusCode=403 StatusDescription=此请求无权使用此权限执行此操作。ErrorCode=ErrorMessage=在shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.services.AbfsRestOperation.execute(AbfsRestOperation.java:134)在shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs。 services.AbfsClient.getFilesystemProperties(AbfsClient.java:197)位于shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.AzureBlobFileSystemStore.getFilesystemProperties(AzureBlobFileSystemStore.java:214)位于shaded.databricks.v20180920_b33d810。 org.apache. hadoop.fs.azurebfs.AzureBlobFileSystem.fileSystemExists(AzureBlobFileSystem.java:749)位于shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem.initialize(AzureBlobFileSystem.java:110)位于com.databricks.backend。 daemon.dbutils.DBUtilsCore.verifyAzureFileSystem(DBUtilsCore.scala:485) 在 com.databricks.backend.daemon.dbutils.DBUtilsCore.mount(DBUtilsCore.scala:435) 在 sun.reflect.GenerateMethodAccessor400.invoke(未知来源) 在太阳。 Reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) 在 py4j.reflection.ReflectionEngine .invoke(ReflectionEngine.java:380) 在 py4j.Gateway.invoke(Gateway.java:295) 在 py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在 py4j.commands.CallCommand.execute(CallCommand.java: 79) 在 py4j.GatewayConnection.run(GatewayConnection.java:251) 在 java.lang.Thread.run(Thread.java:748)

sim*_*ias 5

Gen2 Lakes 没有容器,它们有文件系统(这是一个非常相似的概念)。

您是否在您的存储帐户上启用了“分层命名空间”功能?您可以在存储帐户的“配置”边栏选项卡中看到这一点。如果您有,则存储帐户是 Lake Gen2 - 如果没有,它只是一个 Blob 存储帐户,您需要按照使用 Blob 存储的说明进行操作。

假设您已经设置了该功能,那么您可以看到“文件系统”边栏选项卡 - 您可以在其中创建文件系统,其方式与 Blob 容器非常相似。这是您在 abfss URL 开头所需的名称。

但是,您收到的错误消息向我表明您的服务主体没有数据湖的权限。您应该使用存储帐户资源上的 RBAC 角色授予权限(添加到存储帐户贡献者或读者)。或者使用存储资源管理器以更细粒度的级别授予权限。

请记住,数据湖需要对从根目录到您尝试读取/写入的文件夹的每个文件夹的执行权限。作为测试,请先尝试从根目录读取文件。

  • 上述答案以及[本文](https://deep.data.blog/2019/03/28/avoiding-error-403-request-not-authorized-when-accessing-adls-gen-2-from- azure-databricks-while-using-a-service-principal/) 对我帮助很大。 (3认同)

Sal*_*ara 5

我曾经有过类似的问题。我的存储帐户是gen2,它包含 2 个filesystem和 1 个普通容器。

然后我给了 service-principal-app 这个角色 -->Storage Blob Data Contributor

它解决了我的问题。现在我可以从数据块访问已安装的容器。

以下是如何向 service-principal-app 授予权限:

  1. 开设存储帐户
  2. 开放IAM
  3. 单击添加 --> 添加角色分配
  4. 搜索并选择Storage Blob Data Contributor
  5. 在会员上:选择您的应用程序