Montagem de armazenamento de objetos em cloud no Databricks

Importante

As montagens são um padrão de acesso legado. A Databricks recomenda o uso do Unity Catalog para gerenciar todo o acesso aos dados. Consulte Conectar-se ao serviço e armazenamento de objetos cloud usando Unity Catalog.

O Databricks permite que os usuários montem armazenamento de objetos na nuvem no Databricks File System (DBFS) para simplificar os padrões de acesso a dados para usuários que não estão familiarizados com conceitos de nuvem. Dados montados não funcionam com o Unity Catalog, e o Databricks recomenda migrar para o gerenciamento da governança de dados com o Unity Catalog em vez de usar montagens.

Como o Databricks monta o armazenamento de objetos em cloud?

As montagens do Databricks criam um link entre um workspace e o armazenamento de objetos em cloud, o que permite que você interaja com o armazenamento de objetos em cloud usando caminhos de arquivo familiares relativos ao sistema de arquivos do Databricks. As montagens funcionam criando um alias local no diretório /mnt que armazena as seguintes informações:

  • Localização do armazenamento de objetos em cloud.

  • Especificações do driver para conectar-se à account de armazenamento ou ao contêiner.

  • Credenciais de segurança necessárias para acessar os dados.

Qual é a sintaxe para montar o armazenamento?

O source especifica o URI do armazenamento de objetos (e pode, opcionalmente, codificar credenciais de segurança). mount_point especifica o caminho local no diretório /mnt . Algumas fontes de armazenamento de objetos suportam um argumento encryption_type opcional. Para alguns padrões de acesso, você pode passar especificações de configuração adicionais como um dicionário para extra_configs.

Observação

Databricks recomenda definir configurações específicas de Spark e Hadoop para o mount como opções usando extra_configs. Isso garante que as configurações estejam vinculadas ao mount e não ao cluster ou sessão.

dbutils.fs.mount(
  source: str,
  mount_point: str,
  encryption_type: Optional[str] = "",
  extra_configs: Optional[dict[str:str]] = None
)

Verifique com os administradores do seu workspace e de cloud antes de configurar ou alterar as montagens de dados, pois uma configuração inadequada pode fornecer acesso inseguro a todos os usuários do seu workspace.

Observação

Além das abordagens descritas neste artigo, você pode automatizar a montagem de um bucket com o provedor Databricks Terraform e databricks_mount.

Desmontar um ponto de montagem

Para desmontar um ponto de montagem, use o seguinte comando:

dbutils.fs.unmount("/mnt/<mount-name>")

Aviso

Para evitar erros, nunca modifique um ponto de montagem enquanto outros jobs estão lendo ou gravando nele. Depois de modificar uma montagem, sempre execute dbutils.fs.refreshMounts() em todos os outros clusters em execução para propagar qualquer atualização de montagem. Veja o comando refreshMounts (dbutils.fs.refreshMounts).

Montar um bucket do S3

Você pode montar um bucket do S3 por meio de O que és DBFS? A montagem é um ponteiro para um local do S3 e, portanto, os dados nunca são sincronizados localmente.

Depois que um ponto de montagem é criado por meio de um cluster, os usuários podem acessá-lo imediatamente. Para usar o ponto de montagem em outro cluster em execução, você deve executar dbutils.fs.refreshMounts() nesse cluster em execução para disponibilizar o ponto de montagem recém-criado.

Você pode usar os seguintes métodos para montar um bucket S3:

Monte um bucket usando um instance profile da AWS

Você pode gerenciar a autenticação e a autorização para um bucket S3 usando um instance profile da AWS. O acesso aos objetos no bucket é determinado pelas permissões concedidas ao instance profile. Se a função tiver acesso de gravação, os usuários do ponto de montagem poderão gravar objetos no bucket. Se a função tiver acesso de leitura, os usuários do ponto de montagem poderão ler os objetos no bucket.

  1. Configurar seu cluster com um instance profile.

  2. Monte o bucket.

    aws_bucket_name = "<aws-bucket-name>"
    mount_name = "<mount-name>"
    dbutils.fs.mount(f"s3a://{aws_bucket_name}", f"/mnt/{mount_name}")
    display(dbutils.fs.ls(f"/mnt/{mount_name}"))
    
    val AwsBucketName = "<aws-bucket-name>"
    val MountName = "<mount-name>"
    
    dbutils.fs.mount(s"s3a://$AwsBucketName", s"/mnt/$MountName")
    display(dbutils.fs.ls(s"/mnt/$MountName"))
    

Monte um bucket usando AWS keys

Você pode montar um bucket usando AWS keys.

Importante

Quando você monta um bucket do S3 usando keys, todos os usuários têm acesso de leitura e gravação a todos os objetos no bucket do S3.

Os exemplos a seguir usam segredos do Databricks para armazenar as keys. Você utilizar escape da URL da chave secreta.

access_key = dbutils.secrets.get(scope = "aws", key = "aws-access-key")
secret_key = dbutils.secrets.get(scope = "aws", key = "aws-secret-key")
encoded_secret_key = secret_key.replace("/", "%2F")
aws_bucket_name = "<aws-bucket-name>"
mount_name = "<mount-name>"

dbutils.fs.mount(f"s3a://{access_key}:{encoded_secret_key}@{aws_bucket_name}", f"/mnt/{mount_name}")
display(dbutils.fs.ls(f"/mnt/{mount_name}"))
val AccessKey = dbutils.secrets.get(scope = "aws", key = "aws-access-key")
// Encode the Secret Key as that can contain "/"
val SecretKey = dbutils.secrets.get(scope = "aws", key = "aws-secret-key")
val EncodedSecretKey = SecretKey.replace("/", "%2F")
val AwsBucketName = "<aws-bucket-name>"
val MountName = "<mount-name>"

dbutils.fs.mount(s"s3a://$AccessKey:$EncodedSecretKey@$AwsBucketName", s"/mnt/$MountName")
display(dbutils.fs.ls(s"/mnt/$MountName"))

Montar um bucket usando instance profiles com a policy AssumeRole

Primeiro, você deve configurar os buckets do S3 entre accounts do Access com uma policy AssumeRole.

Monte buckets enquanto define as opções do S3 no extraConfigs:

dbutils.fs.mount("s3a://<s3-bucket-name>", "/mnt/<s3-bucket-name>",
  extra_configs = {
    "fs.s3a.credentialsType": "AssumeRole",
    "fs.s3a.stsAssumeRole.arn": "arn:aws:iam::<bucket-owner-acct-id>:role/MyRoleB",
    "fs.s3a.canned.acl": "BucketOwnerFullControl",
    "fs.s3a.acl.default": "BucketOwnerFullControl"
  }
)
dbutils.fs.mount("s3a://<s3-bucket-name>", "/mnt/<s3-bucket-name>",
  extraConfigs = Map(
    "fs.s3a.credentialsType" -> "AssumeRole",
    "fs.s3a.stsAssumeRole.arn" -> "arn:aws:iam::<bucket-owner-acct-id>:role/MyRoleB",
    "fs.s3a.canned.acl" -> "BucketOwnerFullControl",
    "fs.s3a.acl.default" -> "BucketOwnerFullControl"
  )
)

Criptografe os dados nos buckets do S3

O Databricks oferece suporte à criptografia de dados usando criptografia do lado do servidor. Esta seção aborda como usar a criptografia no lado do servidor ao gravar arquivos no S3 por meio do DBFS. O Databricks oferece suporte a keys de criptografia gerenciadas pelo Amazon S3 (SSE-S3) e keys de criptografia gerenciadas pelo AWS KMS (SSE-KMS) .

Escrever arquivos usando SSE-S3

  1. Para montar seu bucket S3 com SSE-S3, execute o seguinte comando:

    dbutils.fs.mount(s"s3a://$AccessKey:$SecretKey@$AwsBucketName", s"/mnt/$MountName", "sse-s3")
    
  2. Para gravar arquivos no bucket S3 correspondente com SSE-S3, execute:

    dbutils.fs.put(s"/mnt/$MountName", "<file content>")
    

Gravar arquivos usando SSE-KMS

  1. Monte um diretório de source passando sse-kms ou sse-kms:$KmsKey como o tipo de criptografia.

    • Para montar seu bucket S3 com SSE-KMS usando a master key KMS padrão, execute:

      dbutils.fs.mount(s"s3a://$AccessKey:$SecretKey@$AwsBucketName", s"/mnt/$MountName", "sse-kms")
      
    • Para montar seu bucket S3 com SSE-KMS usando uma key KMS específica, execute:

      dbutils.fs.mount(s"s3a://$AccessKey:$SecretKey@$AwsBucketName", s"/mnt/$MountName", "sse-kms:$KmsKey")
      
  2. Para gravar arquivos no bucket S3 com SSE-KMS, execute:

    dbutils.fs.put(s"/mnt/$MountName", "<file content>")
    

Montagem de buckets S3 com o serviço de commit do Databricks

Se você planeja gravar em uma determinada tabela armazenada no S3 a partir de múltiplos clusters ou workloads simultaneamente, o Databricks recomenda que você Configure os serviços de commit do Databricks S3. Seu código no notebook deve montar o bucket e adicionar a configuração AssumeRole. Esta etapa é necessária apenas para montagens DBFS, não para acessar o armazenamento DBFS root no bucket raiz S3 do seu workspace. O exemplo a seguir usa Python:


# If other code has already mounted the bucket without using the new role, unmount it first
dbutils.fs.unmount("/mnt/<mount-name>")

# mount the bucket and assume the new role
dbutils.fs.mount("s3a://<bucket-name>/", "/mnt/<mount-name>", extra_configs = {
    "fs.s3a.credentialsType": "AssumeRole",
    "fs.s3a.stsAssumeRole.arn": "<role-arn>"
})

Monte o ADLS Gen2 ou o Blob Storage com ABFS

Você pode montar dados em uma conta de armazenamento do Azure usando uma entidade de serviço de aplicação do Microsoft Entra ID para autenticação. Para mais informações, consulte Acessar armazenamento usando uma entidade de serviço e Microsoft Entra ID (Azure Active Directory).

Importante

  • Todos os usuários no workspace do Databricks têm acesso à account do ADLS Gen2 montada. A entidade de serviço que você usa para acessar a account do ADLS Gen2 deve ter acesso apenas a essa account do ADLS Gen2; ele não deve ter acesso a outros recursos do Azure.

  • Quando você cria um ponto de montagem por meio de um cluster, os usuários do cluster podem acessá-lo imediatamente. Para usar o ponto de montagem em outro cluster em execução, você deve executar dbutils.fs.refreshMounts() nesse cluster em execução para disponibilizar o ponto de montagem recém-criado para uso.

  • Desmontar um ponto de montagem enquanto as tarefas estão em execução pode causar erros. Certifique-se de que os jobs de produção não desmontem o armazenamento como parte do processamento.

  • Os pontos de montagem que usam segredos não são atualizados automaticamente. Se o armazenamento montado depender de um segredo que é rotacionado, expira ou é excluído, podem ocorrer erros, como 401 Unauthorized. Para resolver esse erro, você deve desmontar e remontar o armazenamento.

  • O namespace hierárquico (HNS) deve estar habilitado para montar com sucesso uma conta de armazenamento do Azure Data Lake Storage Gen2 usando o endpoint ABFS.

Execute o seguinte em seu notebook para autenticar e criar um ponto de montagem.

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="<service-credential-key-name>"),
          "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://<container-name>@<storage-account-name>.dfs.core.windows.net/",
  mount_point = "/mnt/<mount-name>",
  extra_configs = configs)
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="<service-credential-key-name>"),
  "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://<container-name>@<storage-account-name>.dfs.core.windows.net/",
  mountPoint = "/mnt/<mount-name>",
  extraConfigs = configs)

Substituir

  • <application-id> pelo ID da aplicação (cliente) para a aplicação Azure Active Directory.

  • <scope-name> pelo nome do secret scope do Databricks.

  • <service-credential-key-name> pelo nome da key que contém o segredo do cliente.

  • <directory-id> pela ID do diretório (tenant) para a aplicação Azure Active Directory.

  • <container-name> com o nome de um contêiner na account de armazenamento ADLS Gen2.

  • <storage-account-name> com o nome da account de armazenamento ADLS Gen2.

  • <mount-name> com o nome do ponto de montagem pretendido no DBFS.