Требуется дополнительная конфигурация для поддержки Azure Data Lake Gen 2 сквозного соединения в блестящем соединении Databricks? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть Azure Databricks (Databricks 6.4 (включает в себя Apache Spark 2.4.5, Scala 2.11)). Стандартный кластер, настроенный для работы с Active Directory для поддержки запросов к Azure Data Lake Gen 2.

ADLS был смонтирован через python:

configs = {
  "fs.azure.account.auth.type": "CustomAccessToken",
  "fs.azure.account.custom.token.provider.class":   spark.conf.get("spark.databricks.passthrough.adls.gen2.tokenProviderClassName")
}


dbutils.fs.mount(
  source = "abfss://taxi@purelyexample.dfs.core.windows.net/",
  mount_point = "/mnt/taxi",
  extra_configs = configs)

Использование {sparkR} из блокнота данных возвращает результаты.

taxiall <- read.df("/mnt/taxi/yellow",source="parquet")
collect(mean(rollup(taxiall, "vendorID", "puLocationId"), "totalAmount"))

Использование {sparklyr} дает проблема с токеном.

library(sparklyr)
library(dplyr)
sc <- spark_connect(method = "databricks")
yellowtaxi <- spark_read_parquet(path="/mnt/taxi/yellow",sc=sc)
yellow_taxi %>%
  group_by(vendorID, puLocationId) %>%
  summarise(avgFare= mean(totalAmount), n= n()) ->
  fares

collect(fares)

Ошибка: com.databricks.backend.daemon.data.client.adl.AzureCredentialNotFoundException: не удалось найти токен ADLS Gen2

Нужно ли что-то еще, чтобы обеспечить работу sparklyr с проходом учетных данных?

1 Ответ

0 голосов
/ 31 марта 2020

Примечание: Монтирование Azure Data Lake Storage Gen2 поддерживается только с использованием учетных данных OAuth. Монтирование с использованием ключа доступа к учетной записи не поддерживается.

Причина: Функция spark_read_csv в Sparklyr не может извлечь токен ADLS для включения аутентификации и чтения данных.

Решение: Обходное решение - использовать Azure идентификатор приложения, ключ приложения и идентификатор каталога для подключения ADLS в DBFS.

** Mount Azure Data Lake Storage Gen2 файловая система: **

Чтобы смонтировать файловую систему * 237 * Data Lake Storage Gen2 или папку внутри нее, используйте следующую команду:

Scala код:

val configs = Map(
  "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 = "<key-name-for-service-credential>"),
  "fs.azure.account.oauth2.client.endpoint" -> "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 = "abfss://<file-system-name>@<storage-account-name>.dfs.core.windows.net/",
  mountPoint = "/mnt/<mount-name>",
  extraConfigs = configs)

Python Код:

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 = "<key-name-for-service-credential>"),
           "fs.azure.account.oauth2.client.endpoint": "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 = "abfss://<file-system-name>@<storage-account-name>.dfs.core.windows.net/",
  mount_point = "/mnt/<mount-name>",
  extra_configs = configs)

Ссылка: Ошибка при чтении данных из ADLS Gen1 / gen2 с помощью Sparklyr и " Монтирование учетной записи Azure Data Lake Storage Gen2 с использованием субъекта службы и OAuth 2.0 ".

...