Как получить доступ к разным учетным записям хранения с одинаковым именем контейнера в записных книжках databricks

#pyspark #jupyter-notebook #databricks #azure-databricks #azure-data-lake-gen2

Вопрос:

У меня есть 2 разные учетные записи хранилища с одинаковым именем контейнера. Скажем, tenant1 и tenant2 в качестве имени учетной записи хранения с «appdata» в качестве имени контейнера в обеих учетных записях. Я могу создать и смонтировать оба контейнера в dbfs. Но я не могу динамически читать/записывать, передавая имена учетных записей хранения в код точки монтирования. поскольку в dbfs в качестве точки монтирования в dbfs используется имя mnt/containername, в ссылках на данные указывается только последняя или ранее переданная точка монтирования учетной записи хранения. Как достичь моей цели здесь?

Ответ №1:

Точки монтирования должны быть статичными, поэтому вам просто нужно иметь две разные точки монтирования, указывающие на правильный контейнер, что-то вроде этого:

 /mnt/storage1_appdata
/mnt/storage2_appdata
 

поэтому, если вы хотите, чтобы ваш код был динамичным, используйте f"/mnt/{storage_name}_appdata" .

Не рекомендуется динамически перемонтировать контейнеры — вы можете получить загадочные ошибки, когда вы перемонтируете точку монтирования, пока кто-то читает/записывает данные, используя ее.

Кроме того, вы можете получить прямой доступ к ADLS, если укажете правильную конфигурацию для своего кластера/задания (см. документ) — вы даже можете получить доступ к обоим контейнерам одновременно, просто нужно настроить конфигурацию для обеих учетных записей хранения:

 spark.conf.set("fs.azure.account.auth.type.<storage-account-name>.dfs.core.windows.net", 
  "OAuth")
spark.conf.set(
  "fs.azure.account.oauth.provider.type.<storage-account-name>.dfs.core.windows.net", 
  "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set(
  "fs.azure.account.oauth2.client.id.<storage-account-name>.dfs.core.windows.net", 
  "<application-id>")
spark.conf.set(
  "fs.azure.account.oauth2.client.secret.<storage-account-name>.dfs.core.windows.net", 
  dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>"))
spark.conf.set(
  "fs.azure.account.oauth2.client.endpoint.<storage-account-name>.dfs.core.windows.net", 
  "https://login.microsoftonline.com/<directory-id>/oauth2/token")
 

Комментарии:

1. Понял суть, поэтому всегда /mnt/{имя_контейнера} должен быть уникальным, когда дело доходит до dbfs. Поправьте меня, если я ошибаюсь.

2. Да, имя точки монтирования произвольно — вы можете использовать любое имя, даже монтировать один и тот же контейнер несколько раз. Обычно люди пытаются использовать оригинальные имена, просто чтобы понять, куда идут данные, но если у вас одинаковые имена, вам нужно добавить к ним что-то уникальное, например, создать имя из комбинации учетной записи хранения имя контейнера