Доступ к Azure Data Lake Storage 1-го поколения из Azure Databricks

Корпорация Майкрософт объявила о плановом прекращении использования Azure Data Lake Storage 1-го поколения (прежнее название — Azure Data Lake Store, также известно как ADLS) и рекомендует всем пользователям перейти на Azure Data Lake Storage 2-го поколения. Databricks рекомендует выполнить обновление до Azure Data Lake Storage 2-го поколения для повышения производительности и получения новых функций.

Есть два метода доступа к Azure Data Lake Storage 1-го поколения:

  1. Передайте учетные данные Microsoft Entra ID (ранее Azure Active Directory), также известные как сквозное руководство.
  2. Непосредственное использование субъекта-службы.

Автоматический доступ с помощью идентификатора Microsoft Entra (ранее Azure Active Directory)

Вы можете выполнять автоматическую проверку подлинности в Azure Data Lake Storage 1-го поколения из кластеров Azure Databricks с помощью того же идентификатора Microsoft Entra ID, который вы используете для входа в Azure Databricks. Если вы включите пароль для учетных данных идентификатора Microsoft Entra, команды, выполняемые в этом кластере, смогут считывать и записывать данные в Azure Data Lake Storage 1-го поколения без необходимости настраивать учетные данные субъекта-службы для доступа к хранилищу.

Полные инструкции по настройке и использованию см. в статье Access Azure Data Lake служба хранилища с использованием учетных данных Microsoft Entra ID (прежнее название — Azure Active Directory).

Создание и предоставление разрешений субъекту-службе

Если выбранный метод доступа требует наличия субъекта-службы с соответствующими разрешениями и у его нет, выполните указанные ниже действия.

  1. Создайте приложение и субъект-службу Microsoft Entra ID (прежнее название — Azure Active Directory), которое может получить доступ к ресурсам. Обратите внимание на следующие свойства:
    • application-id: идентификатор, однозначно определяющий клиентское приложение.
    • directory-id: идентификатор, который однозначно идентифицирует экземпляр идентификатора Microsoft Entra.
    • service-credential: строка, которую приложение использует для подтверждения идентификации.
  2. Зарегистрируйте субъект-службу, назначив правильные роли, например участника, для учетной записи Azure Data Lake Storage 1-го поколения.

Доступ напрямую к API Spark с помощью субъекта-службы и OAuth 2.0

Чтобы прочитать данные из учетной записи Azure Data Lake Storage 1-го поколения, можно настроить Spark для использования учетных данных службы с помощью следующего фрагмента в записной книжке:

spark.conf.set("fs.adl.oauth2.access.token.provider.type", "ClientCredential")
spark.conf.set("fs.adl.oauth2.client.id", "<application-id>")
spark.conf.set("fs.adl.oauth2.credential", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"))
spark.conf.set("fs.adl.oauth2.refresh.url", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

где

  • dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>") извлекает ключ доступа к учетной записи хранения, который сохранен в качестве секрета в области секрета.

После настройки учетных данных для доступа к ресурсам вы можете использовать стандартные API Spark и Databricks. Например:

val df = spark.read.format("parquet").load("adl://<storage-resource>.azuredatalakestore.net/<directory-name>")

dbutils.fs.ls("adl://<storage-resource>.azuredatalakestore.net/<directory-name>")

Azure Data Lake Storage 1-го поколения обеспечивает контроль доступа на уровне каталога, поэтому у субъекта-службы должен быть доступ к каталогам, из которых требуется считывать данные, а также к ресурсу Azure Data Lake Storage 1-го поколения.

Доступ через хранилище метаданных

Для доступа к расположениям adl://, указанным в хранилище метаданных, необходимо указать параметры конфигурации учетных данных Hadoop в качестве параметров Spark при создании кластера, добавив префикс spark.hadoop. к соответствующим ключам конфигурации Hadoop, чтобы распространить их в конфигурациях Hadoop, используемых хранилищем метаданных.

spark.hadoop.fs.adl.oauth2.access.token.provider.type ClientCredential
spark.hadoop.fs.adl.oauth2.client.id <application-id>
spark.hadoop.fs.adl.oauth2.credential <service-credential>
spark.hadoop.fs.adl.oauth2.refresh.url https://login.microsoftonline.com/<directory-id>/oauth2/token

Предупреждение

  • Эти учетные данные доступны всем пользователям, имеющих доступ к кластеру.

Подключение ресурса или папки Azure Data Lake Storage 1-го поколения

Чтобы подключить ресурс Azure Data Lake Storage 1-го поколения или папку внутри него, используйте следующую команду:

Python

configs = {"fs.adl.oauth2.access.token.provider.type": "ClientCredential",
          "fs.adl.oauth2.client.id": "<application-id>",
          "fs.adl.oauth2.credential": dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"),
          "fs.adl.oauth2.refresh.url": "https://login.microsoftonline.com/<directory-id>/oauth2/token"}

# Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "adl://<storage-resource>.azuredatalakestore.net/<directory-name>",
  mount_point = "/mnt/<mount-name>",
  extra_configs = configs)

Scala

val configs = Map(
  "fs.adl.oauth2.access.token.provider.type" -> "ClientCredential",
  "fs.adl.oauth2.client.id" -> "<application-id>",
  "fs.adl.oauth2.credential" -> dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"),
  "fs.adl.oauth2.refresh.url" -> "https://login.microsoftonline.com/<directory-id>/oauth2/token")

// Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "adl://<storage-resource>.azuredatalakestore.net/<directory-name>",
  mountPoint = "/mnt/<mount-name>",
  extraConfigs = configs)

где

  • <mount-name> — это путь в DBFS, который представляет место подключения в DBFS учетной записи Azure Data Lake Storage 1-го поколения или папки внутри нее (заданной с помощью source).
  • dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>") извлекает ключ доступа к учетной записи хранения, который сохранен в качестве секрета в области секрета.

Доступ к файлам в контейнере осуществляется так же, как к локальным файлам, например:

Python

df = spark.read.format("text").load("/mnt/<mount-name>/....")
df = spark.read.format("text").load("dbfs:/mnt/<mount-name>/....")

Scala

val df = spark.read.format("text").load("/mnt/<mount-name>/....")
val df = spark.read.format("text").load("dbfs:/mnt/<mount-name>/....")

Настройка учетных данных службы для нескольких учетных записей

Чтобы настроить учетные данные службы для нескольких учетных записей Azure Data Lake Storage 1-го поколения для использования в одном сеансе Apache Spark, добавьте account.<account-name> в ключи конфигурации. Например, если вы хотите настроить учетные данные для учетных записей с целью одновременного доступа к adl://example1.azuredatalakestore.net и adl://example2.azuredatalakestore.net, это можно сделать следующим образом:

spark.conf.set("fs.adl.oauth2.access.token.provider.type", "ClientCredential")

spark.conf.set("fs.adl.account.example1.oauth2.client.id", "<application-id-example1>")
spark.conf.set("fs.adl.account.example1.oauth2.credential", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential-example1>"))
spark.conf.set("fs.adl.account.example1.oauth2.refresh.url", "https://login.microsoftonline.com/<directory-id-example1>/oauth2/token")

spark.conf.set("fs.adl.account.example2.oauth2.client.id", "<application-id-example2>")
spark.conf.set("fs.adl.account.example2.oauth2.credential", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential-example2>"))
spark.conf.set("fs.adl.account.example2.oauth2.refresh.url", "https://login.microsoftonline.com/<directory-id-example2>/oauth2/token")

Это также работает для конфигурации кластера Spark.

spark.hadoop.fs.adl.oauth2.access.token.provider.type ClientCredential

spark.hadoop.fs.adl.account.example1.oauth2.client.id <application-id-example1>
spark.hadoop.fs.adl.account.example1.oauth2.credential <service-credential-example1>
spark.hadoop.fs.adl.account.example1.oauth2.refresh.url https://login.microsoftonline.com/<directory-id-example1>/oauth2/token

spark.hadoop.fs.adl.account.example2.oauth2.client.id <application-id-example2>
spark.hadoop.fs.adl.account.example2.oauth2.credential <service-credential-example2>
spark.hadoop.fs.adl.account.example2.oauth2.refresh.url https://login.microsoftonline.com/<directory-id-example2>/oauth2/token

В следующей записной книжке показано, как получить доступ к Azure Data Lake Storage 1-го поколения напрямую и с путем подключения.

Записная книжка субъекта-службы ADLS 1-го поколения

Получить записную книжку