如何解决将 Azure 存储容器安装到 Databricks 工作区/笔记本导致 AttributeError
我正在尝试使用 Key Vault 支持的机密范围将 Azure Blob 存储容器挂载到 Databricks 工作簿。
设置:
- 创建密钥保管库
- 在 Key Vault 中创建密钥
- 创建了一个 Databricks 秘密作用域
- 这是众所周知的。
Databricks 中的单元格:
%python
dbrick_secret_scope = "dbricks_kv_dev"
dbrick_secret_name = "scrt-account-key"
storage_account_key = dbutils.secrets.get(scope = dbrick_secret_scope,key = dbrick_secret_name)
storage_container = 'abc-test'
storage_account = 'stgdev'
dbutils.fs.mount(
source = f'abfss://{storage_container}@{storage_account}.dfs.core.windows.net/',mount_point = f'/mnt/{storage_account}',extra_configs = {f'fs.azure.accountkey.{storage_account}.dfs.core.windows.net:{storage_account_key}'}
)
结果:
- 错误:
AttributeError: 'set' object has no attribute 'keys'
,mount_point
的dbutils.fs.mount()
行以红色突出显示。 - 完全错误:
AttributeError Traceback (most recent call last)
<command-3166320686381550> in <module>
9 source = f'abfss://{storage_container}@{storage_account}.dfs.core.windows.net/',10 mount_point = f'/mnt/{storage_account}',---> 11 extra_configs = {f'fs.azure.accountkey.{storage_account}.dfs.core.windows.net:{storage_account_key}'}
12 )
/local_disk0/tmp/1625601199293-0/dbutils.py in f_with_exception_handling(*args,**kwargs)
298 def f_with_exception_handling(*args,**kwargs):
299 try:
--> 300 return f(*args,**kwargs)
301 except Py4JJavaError as e:
302 class ExecutionError(Exception):
/local_disk0/tmp/1625601199293-0/dbutils.py in mount(self,source,mount_point,encryption_type,owner,extra_configs)
389 self.check_types([(owner,string_types)])
390 java_extra_configs = \
--> 391 MapConverter().convert(extra_configs,self.sc._jvm._gateway_client)
392 return self.print_return(self.dbcore.mount(source,393 encryption_type,/databricks/spark/python/lib/py4j-0.10.9-src.zip/py4j/java_collections.py in convert(self,object,gateway_client)
520 HashMap = JavaClass("java.util.HashMap",gateway_client)
521 java_map = HashMap()
--> 522 for key in object.keys():
523 java_map[key] = object[key]
524 return java_map
AttributeError: 'set' object has no attribute 'keys'
似乎与 extra_configs
参数有关,但我不确定是什么。谁能看到我错过了什么?
解决方法
在您的情况下真正的错误是您需要提供字典作为 extra_configs
参数,但是您提供的是集合:{{1}} - 发生这种情况是因为您没有正确的语法(两个 { {1}} 丢失)。正确的语法是:{f'fs.azure.accountkey.{storage_account}.dfs.core.windows.net:{storage_account_key}'}
但实际上您无法通过使用存储帐户密钥使用 '
协议进行挂载 - 仅支持使用 {f'fs.azure.accountkey.{storage_account}.dfs.core.windows.net':storage_account_key}
协议进行挂载。对于 abfss
,您必须使用服务主体,并提供其 ID 和机密,如下所示(请参阅 documentation):
wasbs
虽然理论上您可以使用 abfss
协议和存储密钥挂载 ADLS Gen2 存储,但不建议这样做,因为您可能会遇到问题(我个人认为)。另外,不建议使用存储密钥,最好使用共享访问签名 - 这样更安全。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。