Configurar o Delta Lake para controlar o tamanho do arquivo de dados

Observação

As recomendações neste artigo não se aplicam às tabelas gerenciadas do Catálogo do Unity. O Databricks recomenda usar tabelas gerenciadas do Catálogo do Unity com configurações padrão para todas as novas tabelas Delta.

No Databricks Runtime 13.3 e em versões superiores, o Databricks recomenda utilizar o clustering para o layout de tabela Delta. Confira Usar clustering líquido para tabelas Delta.

O Databricks recomenda usar a otimização preditiva para executar OPTIMIZE e VACUUM automaticamente e para tabelas Delta. Consulte Otimização preditiva para tabelas gerenciadas do Catálogo do Unity.

No Databricks Runtime 10.4 LTS e superior, a compactação automática e as gravações otimizadas são sempre habilitadas para as operações MERGE, UPDATEe DELETE. Você não pode desabilitar essa funcionalidade.

O Delta Lake fornece opções para configurar manual ou automaticamente o tamanho do arquivo de destino para gravações e para operações OPTIMIZE. O Azure Databricks ajusta automaticamente muitas dessas configurações e permite recursos que melhoram automaticamente o desempenho da tabela ao buscar o tamanho certo dos arquivos.

Para as tabelas gerenciadas do Catálogo do Unity, o Databricks ajusta a maioria dessas configurações automaticamente se você estiver usando um warehouse do SQL ou o Databricks Runtime 11.3 LTS ou superior.

Se você estiver atualizando uma carga de trabalho do Databricks Runtime 10.4 LTS ou versões anteriores, confira Atualizar para compactação automática em segundo plano.

Quando executar OPTIMIZE

A compactação automática e as gravações otimizadas reduzem os problemas de arquivos pequenos, mas não substituem totalmente o OPTIMIZE. Especialmente para tabelas maiores que 1 TB, o Databricks recomenda executar OPTIMIZE em um agendamento para consolidar ainda mais os arquivos. O Azure Databricks não executa ZORDER automaticamente em tabelas, portanto, você deve executar OPTIMIZE com ZORDER para permitir ignorar dados aprimorados. Confira Ignorar dados no Delta Lake.

O que é a otimização automática no Azure Databricks?

O termo otimização automática às vezes é usado para descrever a funcionalidade controlada pelas configurações delta.autoOptimize.autoCompact e delta.autoOptimize.optimizeWrite. Esse termo foi desativado em favor da descrição de cada configuração individualmente. Consulte Compactação automática do Delta Lake no Azure Databricks e Gravações otimizadas do Delta Lake no Azure Databricks.

Compactação automática para o Delta Lake no Azure Databricks

A compactação automática combina arquivos pequenos dentro das partições de tabela Delta para reduzir automaticamente os problemas de arquivos pequenos. A compactação automática ocorre depois que uma gravação em uma tabela é bem-sucedida e executada de maneira síncrona no cluster que realizou a gravação. A compactação automática compacta somente arquivos que não foram compactados anteriormente.

Você pode controlar o tamanho do arquivo de saída definindo a configuração do Spark spark.databricks.delta.autoCompact.maxFileSize. O Databricks recomenda o uso do ajuste automático com base na carga de trabalho ou no tamanho da tabela. Consulte Ajuste automático do tamanho do arquivo com base na carga de trabalho e Ajuste automático do tamanho do arquivo com base no tamanho da tabela.

A compactação automática só é disparada para partições ou tabelas que tenham pelo menos um certo número de arquivos pequenos. Você pode alterar opcionalmente o número mínimo de arquivos necessários para disparar a compactação automática definindo spark.databricks.delta.autoCompact.minNumFiles.

A compactação automática pode ser habilitada no nível da mesa ou da sessão usando as configurações a seguir:

  • Propriedade da tabela: delta.autoOptimize.autoCompact
  • Configuração da SparkSession: spark.databricks.delta.autoCompact.enabled

Essas configurações aceitam as opções a seguir:

Opções Comportamento
auto (recomendada) Ajusta o tamanho do arquivo de destino, respeitando outras funcionalidades do ajuste automático. Requer o Databricks Runtime 10.4 LTS ou versões superiores.
legacy Alias para true. Requer o Databricks Runtime 10.4 LTS ou versões superiores.
true Use 128 MB como o tamanho do arquivo de destino. Sem dimensionamento dinâmico.
false Desativa a compactação automática. Pode ser definido no nível da sessão para substituir a compactação automática de todas as tabelas Delta modificadas na carga de trabalho.

Importante

No Databricks Runtime 9.1 LTS, quando outros gravadores executam operações como DELETE, MERGE, UPDATE ou OPTIMIZE simultaneamente, a compactação automática pode fazer com que esses outros trabalhos falhem com um conflito de transações. Isso não é um problema no Databricks Runtime 10.4 LTS e versões superiores.

Gravações otimizadas para o Delta Lake no Azure Databricks

As gravações otimizadas melhoram o tamanho do arquivo à medida que os dados são gravados e beneficiam as leituras subsequentes na tabela.

Gravações otimizadas são mais eficientes para tabelas particionadas, pois reduzem o número de pequenos arquivos gravados em cada partição. Gravar menos arquivos grandes é mais eficiente do que gravar muitos arquivos pequenos, mas você ainda pode ver um aumento na latência de gravação porque os dados são misturados antes de serem gravados.

A imagem a seguir demonstra como funcionam as gravações otimizadas:

Gravações otimizadas

Observação

Você pode ter um código que executa coalesce(n) ou repartition(n) pouco antes de gravar seus dados para controlar o número de arquivos gravados. As gravações otimizadas eliminam a necessidade de usar esse padrão.

As gravações otimizadas são habilitadas por padrão para as seguintes operações no Databricks Runtime 9.1 LTS e superiores:

  • MERGE
  • UPDATE com subconsultas
  • DELETE com subconsultas

As gravações otimizadas também são habilitadas para CTAS instruções e INSERT operações ao usar SQL Warehouses. No Databricks Runtime 13.3 LTS e versões superiores, todas as tabelas Delta registradas no Catálogo do Unity têm gravações otimizadas habilitadas para instruções CTAS e operações INSERT para tabelas particionadas.

As gravações otimizadas podem ser habilitadas no nível da tabela ou da sessão usando as configurações a seguir:

  • Configuração da tabela: delta.autoOptimize.optimizeWrite
  • Configuração da SparkSession: spark.databricks.delta.optimizeWrite.enabled

Essas configurações aceitam as opções a seguir:

Opções Comportamento
true Use 128 MB como o tamanho do arquivo de destino.
false Desativar gravações otimizadas. Pode ser definido no nível da sessão para substituir a compactação automática de todas as tabelas Delta modificadas na carga de trabalho.

Definir o tamanho de um arquivo de destino

Se quiser ajustar o tamanho dos arquivos em sua tabela Delta, defina a propriedade tabela delta.targetFileSize para o tamanho desejado. Se essa propriedade estiver configurada, todas as operações de otimização de layout de dados farão o máximo para gerar arquivos do tamanho especificado. Os exemplos aqui incluem otimizar ou ordenação Z, compactação automática e gravações otimizadas.

Observação

Ao usar tabelas gerenciadas do Catálogo do Unity e SQL warehouses ou Databricks Runtime 11.3 LTS e posteriores, somente os comandos OPTIMIZE respeitam a configuração targetFileSize.

Propriedade de tabela
delta.targetFileSize

Tipo: tamanho em bytes ou unidades superiores.

O tamanho do arquivo de destino. Por exemplo, 104857600 (bytes) ou 100mb.

Valor padrão: nenhum

Para tabelas existentes, você pode definir e remover propriedades por meio do comando SQL ALTER TABLE SET TBL PROPERTIES. Você também pode definir essas propriedades automaticamente durante a criação de novas tabelas com as configurações de sessão do Spark. Confira Referência de propriedades da tabela Delta para obter detalhes.

Ajuste automático do tamanho do arquivo com base na carga de trabalho

A Databricks recomenda definir a propriedade da tabela delta.tuneFileSizesForRewrites para true para todas as tabelas que são segmentadas por muitas operações MERGE ou DML, independentemente do Databricks Runtime, Catálogo do Unity ou outras otimizações. Quando definido como true, o tamanho do arquivo de destino da tabela é definido como um limite muito menor, o que acelera as operações intensivas de gravação.

Se não estiver explicitamente definido, o Azure Databricks detecta automaticamente se 9 das últimas 10 operações anteriores em uma tabela Delta foram MERGEoperações e define essa propriedade da tabela comotrue. Você deve definir explicitamente essa propriedade como false para evitar esse comportamento.

Propriedade de tabela
delta.tuneFileSizesForRewrites

Digite: Boolean

Para ajustar tamanhos de arquivo na otimização de layout de dados ou não.

Valor padrão: nenhum

Para tabelas existentes, você pode definir e remover propriedades por meio do comando SQL ALTER TABLE SET TBL PROPERTIES. Você também pode definir essas propriedades automaticamente durante a criação de novas tabelas com as configurações de sessão do Spark. Confira Referência de propriedades da tabela Delta para obter detalhes.

Ajuste automático do tamanho do arquivo com base no tamanho da tabela

Para minimizar a necessidade de ajuste manual, o Azure Databricks ajustará automaticamente o tamanho do arquivo das tabelas Delta com base no tamanho da tabela. O Azure Databricks usará tamanhos de arquivo menores em tabelas menores e tamanhos de arquivo maiores em tabelas maiores para que o número de arquivos na tabela não cresça muito. O Azure Databricks não ajusta automaticamente as tabelas que você ajustou com um tamanho de destino específico ou com base em uma carga de trabalho com regravações frequentes.

O tamanho do arquivo de destino é baseado no tamanho atual da tabela Delta. Para tabelas menores que 2,56 TB, o tamanho do arquivo de destino ajustado automaticamente é 256 MB. Para tabelas com um tamanho entre 2,56 TB e 10 TB, o tamanho de destino aumenta linearmente de 256 MB para 1 GB. Para tabelas maiores que 10 TB, o tamanho do arquivo de destino é 1 GB.

Observação

Quando o tamanho do arquivo de destino de uma tabela cresce, os arquivos existentes não são otimizados novamente como arquivos maiores pelo comando OPTIMIZE. Portanto, uma tabela grande pode ter sempre alguns arquivos menores do que o tamanho de destino. Se for necessário otimizar esses arquivos menores também em arquivos maiores, você poderá configurar um tamanho de arquivo de destino fixo para a tabela usando a propriedade de tabela delta.targetFileSize.

Quando uma tabela for gravada incrementalmente, os tamanhos do arquivo de destino e as contagens de arquivo terão aproximadamente os valores a seguir com base no tamanho da tabela. As contagens de arquivos na tabela são apenas um exemplo. Os resultados reais serão diferentes, dependendo de vários fatores.

Tamanho de tabela Tamanho do arquivo de destino Número aproximado de arquivos na tabela
10 GB 256 MB 40
1 TB 256 MB 4096
2,56 TB 256 MB 10240
3 TB 307 MB 12108
5 TB 512 MB 17339
7 TB 716 MB 20784
10 TB 1 GB 24437
20 TB 1 GB 34437
50 TB 1 GB 64437
100 TB 1 GB 114437

Limitar as linhas gravadas em um arquivo de dados

Ocasionalmente, tabelas com dados estreitos podem ter um erro em que o número de linhas em um determinado arquivo de dados excede os limites de suporte do formato Parquet. Para evitar esse erro, você pode usar a configuração de sessão SQL spark.sql.files.maxRecordsPerFile para especificar o número máximo de registros a serem gravados em um único arquivo para uma tabela do Delta Lake. Especificar um valor de zero ou um valor negativo não representa nenhum limite.

No Databricks Runtime 11.3 LTS e versões posteriores, você também pode usar a opção maxRecordsPerFile do DataFrameWriter ao usar as APIs do DataFrame para gravar em uma tabela do Delta Lake. Quando maxRecordsPerFile é especificado, o valor de configuração spark.sql.files.maxRecordsPerFile da sessão SQL é ignorado.

Observação

O Databricks não recomenda usar essa opção, a menos que seja necessário para evitar o erro acima mencionado. Essa configuração ainda pode ser necessária para algumas tabelas gerenciadas pelo Catálogo do Unity com dados muito estreitos.

Atualizar para compactação automática em segundo plano

A compactação automática em segundo plano está disponível para tabelas gerenciadas do Catálogo do Unity no Databricks Runtime 11.3 LTS e superior. Ao migrar uma carga de trabalho ou tabela herdada, faça o seguinte:

  • Remova a configuração spark.databricks.delta.autoCompact.enabled do Spark das configurações de cluster ou notebook.
  • Para cada tabela, execute ALTER TABLE <table_name> UNSET TBLPROPERTIES (delta.autoOptimize.autoCompact) para remover as configurações de compactação automática herdadas.

Depois de remover essas configurações herdadas, você deverá ver a compactação automática em segundo plano disparada automaticamente para todas as tabelas gerenciadas do Catálogo do Unity.