Compartilhar via


Melhores práticas: Delta Lake

Este artigo descreve as melhores práticas ao usar o Delta Lake.

Visão geral das práticas recomendadas

Veja a seguir as recomendações gerais que se aplicam à maioria das cargas de trabalho do Delta Lake:

Remover configurações Delta herdadas

O Databricks recomenda remover as configurações Delta herdadas mais explícitas das configurações do Spark e das propriedades da tabela ao atualizar para uma nova versão do Databricks Runtime. As configurações herdadas podem impedir que novas otimizações e valores padrão introduzidos pelo Databricks sejam aplicados a cargas de trabalho migradas.

Arquivos compactos

A otimização preditiva executa automaticamente comandos OPTIMIZE e VACUUM em tabelas gerenciadas do Catálogo do Unity. Consulte Otimização preditiva para tabelas gerenciadas do Catálogo do Unity.

O Databricks recomenda a execução frequente do comando OPTIMIZE para compactar arquivos pequenos.

Observação

Essa operação não remove os arquivos antigos. Para removê-los, execute o comando VACUUM.

Não usar o cache do Spark com o Delta Lake

O Databricks não recomenda usar o cache do Spark pelos seguintes motivos:

  • Você perde todos os dados ignorados que podem vir de filtros adicionais adicionados sobre o armazenado em cache DataFrame.
  • Os dados armazenados em cache podem não ser atualizados se a tabela for acessada usando um identificador diferente.

Diferenças entre Delta Lake e Parquet no Apache Spark

Delta Lake lida automaticamente com as operações a seguir. Você nunca deve executar essas operações manualmente:

  • REFRESH TABLE: as tabelas Delta sempre retornam as informações mais atualizadas. Portanto, não há necessidade de chamar REFRESH TABLE manualmente após as alterações.
  • Adicionar e remover partições: o Delta Lake acompanha automaticamente o conjunto de partições presente em uma tabela e atualiza a lista à medida que os dados são adicionados ou removidos. Como resultado, não há necessidade de executar ALTER TABLE [ADD|DROP] PARTITION nem MSCK.
  • Carregar uma única partição: não é necessário ler partições diretamente. Por exemplo, você não precisa executar spark.read.format("parquet").load("/data/date=2017-01-01"). Em vez disso, use uma cláusula WHERE para ignorar dados, como spark.read.table("<table-name>").where("date = '2017-01-01'").
  • Não modifique manualmente os arquivos de dados: o Delta Lake usa o log de transações para confirmar alterações na tabela atomicamente. Não modifique, adicione ou exclua arquivos de dados do Parquet diretamente em uma tabela Delta, porque isso pode levar à perda de dados ou à corrupção da tabela.

Melhorar o desempenho da mesclagem do Delta Lake

Você pode reduzir o tempo necessário para mesclar usando as seguintes abordagens:

  • Reduzir o espaço de pesquisa para correspondências: por padrão, a operação merge pesquisa a tabela Delta inteira para localizar correspondências na tabela de origem. Uma maneira de acelerar merge é reduzir o espaço de pesquisa adicionando restrições conhecidas na condição de correspondência. Por exemplo, suponha que você tenha uma tabela particionada por country e date que deseja usar merge para atualizar as informações do último dia e de um país específico. Adicionar a seguinte condição torna a consulta mais rápida, pois ela procura correspondências apenas nas partições relevantes:

    events.date = current_date() AND events.country = 'USA'
    

    Além disso, essa consulta também reduz as chances de conflitos com outras operações simultâneas. Confira Níveis de isolamento e conflitos de gravação no Azure Databricks para obter mais detalhes.

  • Arquivos compactados: se os dados são armazenados em muitos arquivos pequenos, a leitura dos dados para pesquisar correspondências pode se tornar lenta. Você pode compactar arquivos pequenos em arquivos maiores para melhorar a taxa de transferência de leitura. Consulte Otimizar o layout do arquivo de dados para obter mais detalhes.

  • Controlar as partições de ordem aleatória para gravações: a operação merge embaralha os dados várias vezes para computar e gravar os dados atualizados. O número de tarefas usadas para embaralhar é controlado pela configuração spark.sql.shuffle.partitions da sessão do Spark. Definir esse parâmetro não apenas controla o paralelismo, mas também determina o número de arquivos de saída. Aumentar o valor aumenta o paralelismo, mas também gera um número maior de arquivos de dados menores.

  • Habilitar gravações otimizadas: para tabelas particionadas, o merge pode produzir um número muito maior de arquivos pequenos do que o número de partições em ordem aleatória. Isso ocorre porque cada tarefa em ordem aleatória pode gravar vários arquivos em várias partições e pode se tornar um gargalo de desempenho. Você pode reduzir o número de arquivos habilitando gravações otimizadas. Consulte Gravações otimizadas do Delta Lake no Azure Databricks.

  • Ajustar tamanhos de arquivo na tabela: o Azure Databricks pode detectar automaticamente se uma tabela Delta tem operações frequentes merge que reescrevem arquivos e pode optar por reduzir o tamanho dos arquivos reescritos em antecipação a novas reescritas de arquivo no futuro. Consulte a seção sobre como ajustar os tamanhos dos arquivos para obter detalhes.

  • Mesclagem em ordem aleatória baixa: A Mesclagem em ordem aleatória baixa fornece uma implementação otimizada do MERGE que fornece melhor desempenho para cargas de trabalho mais comuns. Além disso, ele preserva otimizações de layout de dados existentes, como ordenação Z em dados não modificados.