azure - 启用防火墙时将 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)
解决方案
此错误是由服务主体在文件路径上没有读取/执行权限引起的 - 而不是防火墙。
供参考。在 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
推荐阅读
- android - Cordova ionic 创建 Android App Keystore
- pdf - Tesseract PDF 三明治 C++
- python - 在 Webfaction 上部署 Flask Web 应用程序的设置不正确?
- sql-server - 使用 BCP 用单个值填充表的列
- kubernetes - Kubernetes - 封装 DB 的 Pod 崩溃
- asp.net - 在 _ViewStart 中访问 HttpContext
- java - 验证者拒绝类 - Kotlin
- groovy - 如何将此修改后的数组分配给变量?
- bash - 按特定顺序解析文件名和重命名
- c - 每次收到新消息之前,如何刷新/清空 UART(RX)?