Acesse o Azure Data Lake Storage usando a passagem de credenciais do Azure Active Directory

Observação

Este artigo contém referências ao termo lista de permissões, que o Azure Databricks não usa mais. Quando o termo for removido do software, também o removeremos deste artigo.

É possível autenticar automaticamente no ADLS Gen1 (Azure Data Lake Storage Gen1) e no ADLS Gen2 (Azure Data Lake Storage Gen2) de clusters do Azure Databricks com a mesma identidade do Azure AD (Azure Active Directory) usada para fazer logon no Azure Databricks. Ao habilitar a passagem de credencial do Azure Data Lake Storage para seu cluster, os comandos executados nesse cluster podem ler e gravar dados no Azure Data Lake Storage sem exigir que você configure as credenciais da entidade de serviço para acesso ao armazenamento.

A passagem de credenciais do Azure Data Lake Storage tem suporte apenas com o Azure Data Lake Storage Gen1 e Gen2. O Armazenamento de Blob do Azure não dá suporte à passagem de credenciais.

Este artigo cobre:

  • Habilitando a passagem de credencial para clusters padrão e de alta simultaneidade.
  • Configurar a passagem de credencial e inicializar recursos de armazenamento em contas do ADLS.
  • Acessar recursos do ADLS diretamente quando a passagem de credencial estiver habilitada.
  • Acessar recursos do ADLS por meio de um ponto de montagem quando a passagem de credencial estiver habilitada.
  • Recursos e limitações com suporte ao usar a passagem de credencial.

Os notebooks são incluídos para fornecer exemplos de como usar a passagem de credenciais com contas de armazenamento do ADLS Gen1 e ADLS Gen2.

Requisitos

Importante

Você não poderá se autenticar no Azure Data Lake Storage com suas credenciais do Azure Active Directory se estiver atrás de um firewall que não foi configurado para permitir o tráfego Azure Active Directory. O Firewall do Azure bloqueia o acesso ao Active Directory por padrão. Para permitir o acesso, configure a marca de serviço AzureActiveDirectory. É possível encontrar informações equivalentes para soluções de virtualização de rede na marca AzureActiveDirectory no arquivo JSON intervalos de IP do Azure e marcas de serviço. Para obter mais informações, consulte marcas de serviço do Firewall do Azure e Endereços IP do Azure para Nuvem Pública.

Recomendações de ajuste

É possível registrar identidades passadas para o armazenamento do ADLS nos logs de diagnóstico do armazenamento do Azure. O registro em log de identidades permite que solicitações do ADLS sejam vinculadas a usuários individuais dos clusters Azure Databricks. Ative o log de diagnóstico em sua conta de armazenamento para começar a receber estes logs:

  • Azure Data Lake Storage Gen1: siga as instruções em Habilitar o log de diagnóstico para sua conta do Data Lake Storage Gen1.
  • Azure Data Lake Storage Gen2: configure usando o PowerShell com o comando Set-AzStorageServiceLoggingProperty. Especifique 2.0 como a versão, pois o formato de entrada de log 2.0 inclui o nome principal do usuário na solicitação.

Habilitar a passagem de credenciais do Azure Data Lake Storage para um cluster de Alta Simultaneidade

Os clusters de alta simultaneidade podem ser compartilhados por vários usuários. Eles só suportam Python e SQL com passagem de credencial do Azure Data Lake Storage.

Importante

Habilitar a passagem de credencial do Azure Data Lake Storage para um cluster de Alta Simultaneidade bloqueia todas as portas no cluster, exceto as portas 44, 53 e 80.

  1. Ao criar um cluster, de definido Modo de Clustercomo Alta Simultaneidade.
  2. Em Opções Avançadas, selecione Habilitar passagem de credencial para acesso a dados no nível do usuário e permitir apenas comandos do Python e SQL.

Habilitar a passagem de credenciais para clusters de alta simultaneidade

Habilitar a passagem de credenciais do Azure Data Lake Storage para um cluster Standard

os clusters Standard com passagem de credencial são limitados a um único usuário. Os clusters Standard com suporte ao Python, SQL, Scala e R. no Databricks Runtime 6.0 e superior, há suporte para o SparkR; no Databricks Runtime 10.1 e superior, há suporte para o sparklyr.

Você deve atribuir um usuário na criação do cluster, mas o cluster pode ser editado por um usuário com permissões Pode Gerenciar a qualquer momento para substituir o usuário original.

Importante

O usuário atribuído ao cluster deve ter pelo menos a permissão Pode Anexar ao para o cluster para executar comandos no cluster. Os administradores e o criador do cluster têm permissões Pode Gerenciar, mas não podem executar comandos no cluster, a menos que sejam o usuário do cluster designado.

  1. Ao criar um cluster, definido o Modo de Cluster como Standard.
  2. Em Opções Avançadas, selecione Habilitar passagem de credencial para acesso a dados no nível do usuário e selecione o nome de usuário na lista suspensa Acesso de Usuário Único.

Habilitar a passagem de credenciais para clusters Standard

Criar um contêiner

Os contêineres fornecem uma maneira de organizar objetos em uma conta de armazenamento do Azure. Consulte Criar um contêiner para obter detalhes sobre como criar contêineres em um notebook do Azure Databricks ou diretamente no portal do Azure.

Acessar o Azure Data Lake Storage diretamente usando a passagem de credencial

Depois de configurar a passagem de credencial do Azure Data Lake Armazenamento e criar contêineres de armazenamento, você pode acessar os dados diretamente no Azure Data Lake Storage Gen1 usando um caminho adl:// e o Azure Data Lake Storage Gen2 usando um caminho abfss://.

Azure Data Lake Storage Gen1

Python

spark.read.format("csv").load("adl://<storage-account-name>.azuredatalakestore.net/MyData.csv").collect()

R

# SparkR
library(SparkR)
sparkR.session()
collect(read.df("adl://<storage-account-name>.azuredatalakestore.net/MyData.csv", source = "csv"))

# sparklyr
library(sparklyr)
sc <- spark_connect(method = "databricks")
sc %>% spark_read_csv("adl://<storage-account-name>.azuredatalakestore.net/MyData.csv") %>% sdf_collect()
  • Substitua <storage-account-name> pelo nome da ADLS Gen1 de armazenamento.

Azure Data Lake Storage Gen2

Python

spark.read.format("csv").load("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/MyData.csv").collect()

R

# SparkR
library(SparkR)
sparkR.session()
collect(read.df("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/MyData.csv", source = "csv"))

# sparklyr
library(sparklyr)
sc <- spark_connect(method = "databricks")
sc %>% spark_read_csv("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/MyData.csv") %>% sdf_collect()
  • Substitua <container-name> pelo nome de um contêiner na conta de armazenamento do ADLS Gen2.
  • Substitua <storage-account-name> pelo nome da ADLS Gen2 de armazenamento.

Monte o Azure Data Lake Storage para DBFS usando a passagem de credencial

É possível montar uma conta do Azure Data Lake Storage ou uma pasta dentro dela no DBFS (Sistema de Arquivos do Databricks). A montagem é um ponteiro para um repositório data lake, portanto, os dados nunca são sincronizados localmente.

Ao montar dados usando um cluster habilitado com passagem de credencial do Azure Data Lake Storage, todas as leituras ou gravações no ponto de montagem usam suas credenciais do Microsoft Azure AD. Esse ponto de montagem ficará visível para outros usuários, mas os únicos usuários que terão acesso de leitura e gravação são aqueles que:

  • Têm acesso à conta de armazenamento subjacente do Azure Data Lake Storage
  • Estão usando um cluster habilitado para passagem de credencial do Azure Data Lake Storage

Importante

Desmontar um ponto de montagem enquanto os trabalhos estão em execução pode levar a erros. Verifique se os trabalhos de produção não desmontam o armazenamento como parte do processamento.

Azure Data Lake Storage Gen1

Para montar um recurso do Azure Data Lake Storage Gen1 ou uma pasta dentro dele, use os seguintes comandos:

Observação

A partir Databricks Runtime 6.0, o prefixo dfs.adls. do Azure Data Lake Storage chaves de configuração foi preterido em favor do novo prefixo fs.adl.. A compatibilidade com versões anteriores é mantida, o que significa que você ainda pode usar o prefixo antigo. No entanto, há duas advertências ao usar o prefixo antigo. A primeira é que, embora as chaves que usam o prefixo antigo sejam propagadas corretamente, chamar spark.conf.get com uma chave usando o novo prefixo falhará, a menos que seja definido explicitamente. A segunda é que qualquer mensagem de erro referenciando uma chave de configuração do Azure Data Lake Storage sempre usará o novo prefixo. Para versões do Databricks Runtime abaixo de 6.0, você sempre deve usar o prefixo antigo.

Python

configs = {
   "fs.adl.oauth2.access.token.provider.type": "CustomAccessTokenProvider",
   "fs.adl.oauth2.access.token.custom.provider": spark.conf.get("spark.databricks.passthrough.adls.tokenProviderClassName")
 }

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

Scala

 val configs = Map(
   "fs.adl.oauth2.access.token.provider.type" -> "CustomAccessTokenProvider",
   "fs.adl.oauth2.access.token.custom.provider" -> spark.conf.get("spark.databricks.passthrough.adls.tokenProviderClassName")
 )

 // Optionally, you can add <directory-name> to the source URI of your mount point.
 dbutils.fs.mount(
   source = "adl://<storage-account-name>.azuredatalakestore.net/<directory-name>",
   mountPoint = "/mnt/<mount-name>",
   extraConfigs = configs)
  • Substitua <storage-account-name> pelo nome da ADLS Gen2 de armazenamento.
  • Substitua <mount-name> pelo nome do ponto de montagem pretendido no DBFS.

Azure Data Lake Storage Gen2

Para montar um sistema de arquivos do Azure Data Lake Storage Gen2 ou uma pasta dentro dele, use os seguintes comandos:

Python

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

# Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/",
  mount_point = "/mnt/<mount-name>",
  extra_configs = configs)

Scala

val configs = Map(
  "fs.azure.account.auth.type" -> "CustomAccessToken",
  "fs.azure.account.custom.token.provider.class" -> spark.conf.get("spark.databricks.passthrough.adls.gen2.tokenProviderClassName")
)

// Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/",
  mountPoint = "/mnt/<mount-name>",
  extraConfigs = configs)
  • Substitua <container-name> pelo nome de um contêiner na conta de armazenamento do ADLS Gen2.
  • Substitua <storage-account-name> pelo nome da ADLS Gen2 de armazenamento.
  • Substitua <mount-name> pelo nome do ponto de montagem pretendido no DBFS.

Aviso

Não forneça as chaves de acesso da conta de armazenamento ou as credenciais da entidade de serviço para autenticar no ponto de montagem. Isso dará a outros usuários acesso ao sistema de arquivos usando essas credenciais. A finalidade da passagem de credencial do Azure Data Lake Storage é impedir que você tenha que usar essas credenciais e garantir que o acesso ao sistema de arquivos seja restrito aos usuários que têm acesso à conta subjacente do Azure Data Lake Storage.

Segurança

É seguro compartilhar o Azure Data Lake Storage de passagem de credenciais com outros usuários. Você será isolado uns dos outros e não poderá ler nem usar as credenciais uns dos outros.

Recursos compatíveis

Recurso Versão mínima do Databricks Runtime Observações
Python e SQL 5.5
Azure Data Lake Storage Gen1 5.5
%run 5.5
DBFS 5.5 As credenciais serão passadas somente se o caminho do DBFS for resolvido para um local no Azure Data Lake Storage Gen1 ou Gen2. Para caminhos do DBFS que resolvem para outros sistemas de armazenamento, use um método diferente para especificar suas credenciais.
Azure Data Lake Storage Gen2 5.5
cache Delta 5.5
API do PySpark do ML 5.5 As seguintes classes de ML não há suporte:

* org/apache/spark/ml/classification/RandomForestClassifier
* org/apache/spark/ml/clustering/BisectingKMeans
* org/apache/spark/ml/clustering/GaussianMixture
* org/spark/ml/clustering/KMeans
* org/spark/ml/clustering/LDA
* org/spark/ml/evaluation/ClusteringEvaluator
* org/spark/ml/feature/HashingTF
* org/spark/ml/feature/OneHotEncoder
* org/spark/ml/feature/StopWordsRemover
* org/spark/ml/feature/VectorIndexer
* org/spark/ml/feature/VectorSizeHint
* org/spark/ml/regression/IsotonicRegression
* org/spark/ml/regression/RandomForestRegressor
* org/spark/ml/util/DatasetUtils
Variáveis de difusão 5.5 No PySpark, há um limite no tamanho das UDFs do Python que você pode construir, pois UDFs grandes são enviadas como variáveis de difusão.
Bibliotecas no escopo do notebook 5.5
Scala 5.5
SparkR 6,0
sparklyr 10.1
Modularizar ou vincular código em notebooks 6.1
API do PySpark do ML 6.1 Todas as classes do PySpark do ML com suporte.
Ganglia UI 6.1
Databricks Connect 7.3 A passagem tem suporte em clusters Standard.

Limitações

Não há suporte para os seguintes recursos com a passagem de credenciais do Azure Data Lake Storage:

  • %fs (use o comando dbutils.fs equivalente).
  • A REST API do Databricks.
  • Controle de acesso à tabela. As permissões concedidas pela passagem de credencial do Azure Data Lake Storage podem ser usadas para ignorar as permissões finas das ACLs de tabela, enquanto as restrições extras das ACLs de tabela restringirão alguns dos benefícios que você obterá da passagem de credenciais. Especialmente:
    • Se você tiver permissão do Azure AD para acessar os arquivos de dados que se baseiam em uma tabela específica, terá permissões completas nessa tabela por meio da API do RDD, independentemente das restrições colocadas neles por meio de ACLs de tabela.
    • Você será restrito por permissões de ACLs de tabela somente ao usar a API do DataFrame. Você verá avisos sobre não ter permissão SELECT em nenhum arquivo se tentar ler arquivos diretamente com a API do DataFrame, mesmo que você possa ler esses arquivos diretamente por meio da API do RDD.
    • Você não poderá ler de tabelas com suporte de sistemas de arquivos diferentes do Azure Data Lake Storage, mesmo se você tiver permissão de ACL de tabela para ler as tabelas.
  • Os seguintes métodos em objetos SparkContext (sc) e SparkSession (spark):
    • Métodos preteridos.
    • Métodos como addFile() e addJar() que permitiriam que usuários não administradores chamasse código Scala.
    • Qualquer método que acesse um sistema de arquivos diferente do Azure Data Lake Storage Gen1 ou Gen2 (para acessar outros sistemas de arquivos em um cluster com a passagem de credencial do Azure Data Lake Storage habilitada, use um método diferente para especificar suas credenciais e consulte a seção sobre sistemas de arquivos confiáveis em Solução de problemas).
    • As APIs antigas do Hadoop (hadoopFile() e hadoopRDD()).
    • APIs de streaming, uma vez que as credenciais passadas expiram enquanto o fluxo ainda estava em execução.
  • A montagem FUSE (/dbfs) está disponível somente no Databricks Runtime 7.3 LTS e superior. Não há suporte para pontos de montagem com passagem de credencial configurada por meio da montagem FUSE.
  • Azure Data Factory.
  • MLflow em clusters de alta simultaneidade.
  • azureml-sdk Pacote Python em clusters de alta simultaneidade.
  • Não é possível estender o tempo de vida dos tokens de passagem do Azure Active Directory usando as políticas de tempo de vida do token do Azure Active Directory. Como consequência, se você enviar um comando para o cluster que leva mais de uma hora, ele falhará se um recurso do Azure Data Lake Storage for acessado após a marca de 1 hora.
  • Ao usar o Hive 2.3 e superior, você não pode adicionar uma partição em um cluster com a passagem de credencial habilitada. Para obter mais informações, consulte a seção de Solucionar problemas relevantes.

Notebooks de exemplo

Os notebooks a seguir demonstram a passagem de credenciais do Azure Data Lake Storage para Azure Data Lake Storage Gen1 e Gen2.

Notebook de passagem do Azure Data Lake Storage Gen1

Obter notebook

Notebook de passagem do Azure Data Lake Storage Gen2

Obter notebook

Solução de problemas

py4j.security.Py4JSecurityException: … não está na lista de verificação

Essa exceção é gerada quando você acessa um método que o Azure Databricks não marcou explicitamente como seguro para clusters de passagem de credenciais do Azure Data Lake Storage. Na maioria dos casos, isso significa que o método pode permitir que um usuário em um cluster com passagem de credenciais do Azure Data Lake Storage acesse as credenciais de outro usuário.

org.apache.spark.api.python.PythonSecurityException: Path … usa um sistema de arquivos não falso

Essa exceção é lançada ao tentar acessar um sistema de arquivos que não é conhecido pelo cluster de passagem de credenciais do Azure Data Lake Storage para ser seguro. Usar um sistema de arquivos não confiável pode permitir que um usuário em um cluster de passagem de credencial do Azure Data Lake Storage acesse as credenciais de outro usuário, portanto, não permitimos que todos os sistemas de arquivos que não estamos confiantes sejam usados com segurança.

Para configurar o conjunto de sistemas de arquivos confiáveis em um cluster de passagem de credencial do Azure Data Lake Storage, deverão definir a chave de conf do Spark spark.databricks.pyspark.trustedFilesystems nesse cluster como uma lista separada por vírgulas dos nomes de classe que são implementações confiáveis do org.apache.hadoop.fs.FileSystem.

A adição de uma partição falha com AzureCredentialNotFoundException quando a passagem de credencial está habilitada

Ao usar o Hive 2.3-3.1, se você tentar adicionar uma partição em um cluster com a passagem de credencial habilitada, ocorrerá a seguinte exceção:

org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:com.databricks.backend.daemon.data.client.adl.AzureCredentialNotFoundException: Could not find ADLS Gen2 Token

Para resolver esse problema, adicione partições em um cluster sem a passagem de credencial habilitada.