#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. Да, имя точки монтирования произвольно — вы можете использовать любое имя, даже монтировать один и тот же контейнер несколько раз. Обычно люди пытаются использовать оригинальные имена, просто чтобы понять, куда идут данные, но если у вас одинаковые имена, вам нужно добавить к ним что-то уникальное, например, создать имя из комбинации учетной записи хранения имя контейнера