При подключении контейнера хранилища Azure к рабочей области / записной книжке Databricks возникает ошибка AttributeError

Я пытаюсь подключить контейнер хранилища BLOB-объектов Azure к книге Databricks с помощью секретной области, поддерживаемой Key Vault.

Настраивать:

  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_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, 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 ответ

Настоящая ошибка в вашем случае заключается в том, что вам нужно предоставить словарь как extra_configs аргумент, но вы предоставляете набор: {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вы должны использовать принципала службы и предоставить его идентификатор и секрет, например (см. документацию ):

      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": "<application-id>",
          "fs.azure.account.oauth2.client.secret": dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>"),
          "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/<directory-id>/oauth2/token"}

dbutils.fs.mount(
  source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/",
  mount_point = "/mnt/<mount-name>",
  extra_configs = configs)

И хотя теоретически вы можете смонтировать хранилище ADLS Gen2, используя wasbsпротокол и ключ хранилища, это не рекомендуется, так как вы можете столкнуться с проблемами (я лично столкнулся с этим). Также не рекомендуется использовать ключи хранилища, лучше использовать Shared Access Signature - это более безопасно.

Другие вопросы по тегам