启用防火墙后,将ADLS Gen2挂载到Databricks

时间:2019-05-21 14:00:39

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

5 个答案:

答案 0 :(得分:0)

如果在禁用防火墙时它可以工作,则您的服务主体的权限应该正确。

您可能需要在防火墙中添加客户端IP地址或配置地址范围。

enter image description here

有关更多详细信息,您可以参考此link

答案 1 :(得分:0)

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

仅供参考。在Storage Azure上,您可以允许Microsoft可信服务访问资源。这包括数据块。但是就像我说的,我不认为您遇到了防火墙问题。

要解决权限问题,我将首先查看文件系统的IAM角色。从Azure门户转到存储帐户>文件系统,然后打开访问控制(IAM)刀片。使用“检查访问权限”屏幕粘贴您的服务主体的Client / ApplicationID,并检查其拥有的权限。

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

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

如果没有,您仍然可以使用Azure Storage Explorer在文件夹/文件级别授予权限。请记住,链中的所有文件夹在每个级别都必须具有执行权限。例如:

/Root/SubFolder1/SubFolder2/file.csv

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

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

答案 2 :(得分:0)

如果在Azure Data Lake Store Gen2帐户上启用防火墙,则只有deploy Azure Databricks in your own virtual network时,此配置才适用于Azure Databricks。它不适用于没有vnet-injection功能部署的工作空间。 在存储帐户上,您必须启用从公共Databricks子网的访问。

答案 3 :(得分:0)

您需要在创建过程中使用Vnet-Injection 。这篇博客文章将引导您完成整个过程。 https://www.keithmsmith.com/azure-data-lake-firewall-databricks/

答案 4 :(得分:0)

我也遇到了同样的问题,但后来发现您只需要在数据湖上为服务主体指定(存储 Blob 数据贡献者)角色。 如果您只提供了(贡献者)角色,它将不起作用。 或者 Contributor 和 Storage Blob Data Contributor 都不起作用。 您只需在数据湖第 2 代上提供 Storage Blob Data Contributor enter image description here