未经授权,此请求无权执行此操作

时间:2019-03-02 20:34:37

标签: 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)

我已经创建了服务主体并为其创建了密钥,然后在活动目录角色分配中向该服务主体提供了存储Blob角色

根据文档

"abfss://<your-file-system-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>"

您的文件系统==> blob容器内的文件夹应该是什么? 您目录名称==>我在Blob容器中只有一个文件夹,所以在这里感到困惑 storgae(ADLS第2代预览)      Blob容器        夹          a.txt

错误


  

ExecutionError:调用o480.mount时发生错误。   头https://xxxxxxxxx.dfs.core.windows.net/xxxxxx?resource=filesystem&timeout=90   状态码= 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.GeneratedMethodAccessor400.invoke(未知来源)       在sun.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)

3 个答案:

答案 0 :(得分:2)

我们遇到了类似的错误,我们使用 RBAC 将所有者角色授予存储帐户上的服务主体,但不起作用,您必须授予此处列出的角色才能访问目录/容器:{{3} }

答案 1 :(得分:0)

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

您在存储帐户上启用了“分层名称空间”功能吗?您可以在“存储”帐户的“配置”刀片中看到此内容。如果您拥有存储帐户,则该帐户为Lake Gen2-如果不是,那么它只是一个Blob存储帐户,您需要按照说明使用Blob存储。

假设您已设置该功能,则可以看到FileSystems刀片-在其中创建文件系统,其方式与Blob容器非常相似。这是abfss URL开头所需的名称。

但是,您收到的错误消息向我表明您的服务主体没有数据湖上的权限。您应该使用RBAC角色对存储帐户资源(添加到存储帐户提供者或读取者)授予权限。或使用Storage Explorer授予更精细级别的权限。

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

答案 2 :(得分:0)

我只是为此苦苦挣扎,并且已经更正了此设置名称:

"fs.azure.account.oauth.provider.type"

"fs.azure.account.oauth2.provider.type"

执行成功。