首页 > 解决方案 > 启用防火墙时将 ADLS Gen2 挂载到 Databricks

问题描述

当我尝试将 ADLS Gen2 挂载到 Databricks 时,如果启用了 ADLS Gen2 防火墙,我会遇到以下问题:“StatusDescription=此请求无权执行此操作”。但是如果防火墙被禁用,请求就可以正常工作。

有人可以帮忙吗?

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": clientID,
               "fs.azure.account.oauth2.client.secret": keyID,
               "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/" + tenantID + "/oauth2/token"}

dbutils.fs.mount(
  source = "abfss://" + fileSystem + "@" + accountName + ".dfs.core.windows.net/",
  mount_point = "/mnt/adlsGen2",
  extra_configs = configs)

StatusCode=403
StatusDescription=This request is not authorized to perform this operation.
ErrorCode=
ErrorMessage=
    at shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.services.AbfsRestOperation.execute(AbfsRestOperation.java:134)
    at shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.services.AbfsClient.getAclStatus(AbfsClient.java:498)
    at shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.AzureBlobFileSystemStore.getIsNamespaceEnabled(AzureBlobFileSystemStore.java:164)
    at shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.AzureBlobFileSystemStore.getFileStatus(AzureBlobFileSystemStore.java:445)
    at shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem.getFileStatus(AzureBlobFileSystem.java:362)
    at com.databricks.backend.daemon.dbutils.DBUtilsCore.verifyAzureFileSystem(DBUtilsCore.scala:486)
    at com.databricks.backend.daemon.dbutils.DBUtilsCore.mount(DBUtilsCore.scala:435)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:380)
    at py4j.Gateway.invoke(Gateway.java:295)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:251)
    at java.lang.Thread.run(Thread.java:748)

标签: azureazure-data-lakeazure-databricks

解决方案


此错误是由服务主体在文件路径上没有读取/执行权限引起的 - 而不是防火墙。

供参考。在 Storage Azure 上,您可以允许 Microsoft 可信服务访问该资源。这包括 Databricks。但就像我说的,我不相信你有防火墙问题。

为了解决权限问题,我将首先查看文件系统的 IAM 角色。从 Azure 门户转到存储帐户 > 文件系统并打开访问控制 (IAM) 刀片。使用 Check access 屏幕粘贴服务主体的 Client/ApplicationID 并检查它具有哪些权限。

要拥有对文件系统的读取权限,SP 必须具有以下角色之一: * 所有者 * 存储 Blob 数据贡献者 * 存储 Blob 数据所有者 * 存储 Blob 数据读取者

这些角色中的任何一个都将授予读取文件系统中所有文件的完全访问权限。

如果不是,您仍然可以使用 Azure 存储资源管理器在文件夹/文件级别授予权限。请记住,链中的所有文件夹必须在每个级别都具有执行权限。例如:

/Root/SubFolder1/SubFolder2/file.csv

您必须授予对 Root、SubFolder1 和 SubFolder2 的执行权限以及对 SubFolder2 的读取权限。

更多详细信息:https ://docs.microsoft.com/en-us/azure/storage/blobs/data-lake-storage-access-control


推荐阅读