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

Nota

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

No Databricks Runtime 13.3 e superior, o Databricks recomenda o uso de clustering para layout de tabela Delta. Veja Utilizar clustering líquido para tabelas Delta.

O Databricks recomenda o uso da otimização preditiva para execução OPTIMIZE automática e VACUUM para tabelas Delta. Consulte Otimização preditiva para tabelas gerenciadas do Unity Catalog.

No Databricks Runtime 10.4 LTS e superior, a compactação automática e as gravações otimizadas estão sempre habilitadas para MERGE, UPDATEe DELETE operações. Não é possível desativar essa funcionalidade.

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

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

Se você estiver atualizando uma carga de trabalho do Databricks Runtime 10.4 LTS ou inferior, consulte 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 pequenos arquivos, mas não são um substituto completo para OPTIMIZEo . Especialmente para tabelas maiores que 1 TB, o Databricks recomenda a execução OPTIMIZE em um cronograma para consolidar ainda mais os arquivos. O Azure Databricks não é executado ZORDER automaticamente em tabelas, portanto, você deve executar OPTIMIZE com ZORDER para habilitar o salto de dados avançado. Consulte Pulo de dados para Delta Lake.

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

O termo auto otimizar às vezes é usado para descrever a funcionalidade controlada pelas configurações delta.autoOptimize.autoCompact e delta.autoOptimize.optimizeWrite. Este termo foi retirado em favor de descrever cada cenário individualmente. Consulte Compactação automática para Delta Lake no Azure Databricks e Gravações otimizadas para Delta Lake no Azure Databricks.

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

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

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

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

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

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

Essas configurações aceitam as seguintes opções:

Opções Comportamento
auto (recomendado) Ajusta o tamanho do arquivo de destino enquanto respeita outras funcionalidades de ajuste automático. Requer Databricks Runtime 10.4 LTS ou superior.
legacy Alias para true. Requer Databricks Runtime 10.4 LTS ou superior.
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 para 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, UPDATEou OPTIMIZE simultaneamente, a compactação automática pode fazer com que esses outros trabalhos falhem com um conflito de transação. Este não é um problema no Databricks Runtime 10.4 LTS e superior.

Gravações otimizadas para 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.

As gravações otimizadas são mais eficazes 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 embaralhados antes de serem gravados.

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

Gravações otimizadas

Nota

Você pode ter um código que é executado coalesce(n) ou repartition(n) pouco antes de escrever seus dados para controlar o número de arquivos gravados. 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 superior:

  • 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 armazéns SQL. No Databricks Runtime 13.3 LTS e superior, todas as tabelas Delta registradas no Unity Catalog têm gravações otimizadas habilitadas para CTAS instruções e INSERT operações para tabelas particionadas.

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

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

Essas configurações aceitam as seguintes opções:

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

Definir um tamanho de arquivo de destino

Se você quiser ajustar o tamanho dos arquivos em sua tabela Delta, defina a propriedade delta.targetFileSize table para o tamanho desejado. Se essa propriedade for definida, todas as operações de otimização de layout de dados farão uma tentativa de melhor esforço para gerar arquivos do tamanho especificado. Exemplos aqui incluem otimizar ou ordem Z, compactação automática e gravações otimizadas.

Nota

Ao usar tabelas gerenciadas do Unity Catalog e armazéns SQL ou Databricks Runtime 11.3 LTS e superior, apenas OPTIMIZE os comandos respeitam a targetFileSize configuração.

Propriedade Table
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 desdefinir propriedades usando o comando SQL ALTER TABLE SET TBL PROPERTIES. Você também pode definir essas propriedades automaticamente ao criar novas tabelas usando as configurações de sessão do Spark. Consulte Referência de propriedades da tabela delta para obter detalhes.

Autotune tamanho do arquivo com base na carga de trabalho

O Databricks recomenda definir a propriedade delta.tuneFileSizesForRewrites table como true para todas as tabelas que são direcionadas por muitas MERGE operações ou operações DML, independentemente do Databricks Runtime, Unity Catalog ou outras otimizações. Quando definido como true, o tamanho do arquivo de destino da tabela é definido como um limite muito mais baixo, o que acelera as operações com uso intensivo de gravação.

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

Propriedade Table
delta.tuneFileSizesForRewrites

Tipo: Boolean

Se os tamanhos de arquivo devem ser ajustados para otimização do layout de dados.

Valor padrão: Nenhum

Para tabelas existentes, você pode definir e desdefinir propriedades usando o comando SQL ALTER TABLE SET TBL PROPERTIES. Você também pode definir essas propriedades automaticamente ao criar novas tabelas usando as configurações de sessão do Spark. Consulte Referência de propriedades da tabela delta para obter detalhes.

Autotune tamanho do arquivo com base no tamanho da tabela

Para minimizar a necessidade de ajuste manual, o Azure Databricks ajusta automaticamente o tamanho do arquivo das tabelas Delta com base no tamanho da tabela. O Azure Databricks usará tamanhos de arquivo menores para tabelas menores e tamanhos de arquivo maiores para tabelas maiores, para que o número de arquivos na tabela não cresça muito. O Azure Databricks não ajusta automaticamente 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 é de 256 MB. Para tabelas com um tamanho entre 2,56 TB e 10 TB, o tamanho de destino aumentará linearmente de 256 MB para 1 GB. Para tabelas maiores que 10 TB, o tamanho do arquivo de destino é de 1 GB.

Nota

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

Quando uma tabela é escrita incrementalmente, os tamanhos de arquivo de destino e as contagens de arquivos serão próximos aos números a seguir, com base no tamanho da tabela. As contagens de ficheiros nesta tabela são apenas um exemplo. Os resultados reais serão diferentes dependendo de muitos fatores.

Tamanho da tabela Tamanho do arquivo de destino Número aproximado de arquivos na tabela
10 GB 256MB 40
1 TB 256MB 4096
2,56 TB 256MB 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 linhas gravadas em um arquivo de dados

Ocasionalmente, tabelas com dados estreitos podem encontrar um erro quando 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 spark.sql.files.maxRecordsPerFile de sessão SQL para especificar o número máximo de registros para gravar em um único arquivo para uma tabela Delta Lake. Especificar um valor zero ou um valor negativo não representa limite.

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

Nota

Databricks não recomenda o uso desta 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 do Unity Catalog com dados muito restritos.

Atualize para a compactação automática em segundo plano

A compactação automática em segundo plano está disponível para tabelas gerenciadas do Unity Catalog 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 definições de configuração do cluster ou do bloco de anotações.
  • Para cada tabela, execute ALTER TABLE <table_name> UNSET TBLPROPERTIES (delta.autoOptimize.autoCompact) para remover todas as configurações de compactação automática herdadas.

Depois de remover essas configurações herdadas, você verá a compactação automática em segundo plano acionada automaticamente para todas as tabelas gerenciadas pelo Unity Catalog.