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
, UPDATE
e 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 OPTIMIZE
o . 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.maxFileSize
do 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
, UPDATE
ou 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:
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 subconsultasDELETE
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.