将 Azure 存储容器安装到 Databricks 工作区/笔记本导致 AttributeError

时间:2021-07-07 00:36:04

标签: python databricks azure-keyvault azure-databricks azure-secrets

我正在尝试使用 Key Vault 支持的机密范围将 Azure Blob 存储容器挂载到 Databricks 工作簿。

设置:

  1. 创建密钥保管库
  2. 在 Key Vault 中创建密钥
  3. 创建了一个 Databricks 秘密作用域
  • 这是众所周知的。
    • 运行 dbutils.secrets.get(scope = dbrick_secret_scope, key = dbrick_secret_name) 不会出错
    • 查看 Databricks 中的机密会导致 [REDACTED]

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_pointdbutils.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, mount_point,
    393                                                        encryption_type, owner,

/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 参数有关,但我不确定是什么。谁能看到我错过了什么?

1 个答案:

答案 0 :(得分:1)

在您的情况下真正的错误是您需要提供字典作为 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 存储,但不建议这样做,因为您可能会遇到问题(我个人认为)。另外,不建议使用存储密钥,最好使用共享访问签名 - 这样更安全。