A necessidade de otimizar a gravação no Apache Spark
As cargas de trabalho analíticas em mecanismos de processamento de Big Data, como o Apache Spark, têm um desempenho mais eficiente ao usar tamanhos de arquivo maiores padronizados. A relação entre o tamanho do arquivo, o número de arquivos, o número de trabalhos do Spark e suas configurações, executa uma função crítica no desempenho. As cargas de trabalho de ingestão em tabelas de data lake podem ter a característica herdada de gravar constantemente muitos arquivos pequenos; Esse cenário é comumente conhecido como "problema de arquivo pequeno".
Otimizar gravação é um recurso delta lake no Synapse que reduz o número de arquivos gravados e visa aumentar o tamanho de arquivo individual dos dados gravados. Ele otimiza dinamicamente as partições enquanto gera arquivos com um tamanho padrão de 128 MB. O tamanho do arquivo de destino pode ser alterado de acordo com os requisitos de carga de trabalho usando configurações.
Esse recurso atinge o tamanho do arquivo usando uma fase extra de embaralhamento de dados em partições, causando um custo extra de processamento ao gravar os dados. A pequena penalidade de gravação deve ser superada pela eficiência de leitura nas tabelas.
Observação
- Ele está disponível nos Pools do Synapse para o Apache Spark versões acima de 3.1.
Benefícios da otimização de gravações
- Ele está disponível nas tabelas delta lake para padrões de gravação em Lote e Streaming.
- Não é necessário alterar o
spark.write
padrão de comando. O recurso é habilitado por uma configuração ou uma propriedade de tabela. - Ele reduz o número de transações de gravação em comparação com o comando OPTIMIZE.
- As operações OPTIMIZE serão mais rápidas, pois funcionarão em menos arquivos.
- O comando VACUUM para exclusão de arquivos antigos não referenciados também funcionará mais rapidamente.
- As consultas verificarão menos arquivos com tamanhos de arquivo mais ideais, melhorando o desempenho de leitura ou o uso de recursos.
Otimizar cenários de uso de gravação
Quando usar isso
- As tabelas particionadas do Delta lake estão sujeitas a padrões de gravação que geram tamanhos de arquivos abaixo do ideal (menos de 128 MB) ou não padronizados (arquivos com tamanhos diferentes entre si).
- Quadros de dados reparticionados que serão gravados em disco com tamanho de arquivos abaixo do ideal.
- Tabelas particionadas do Delta Lake direcionadas por comandos SQL de lote pequeno, como UPDATE, DELETE, MERGE, CREATE TABLE AS SELECT, INSERT INTO, etc.
- Cenários de ingestão de streaming com padrões de dados de acréscimo a tabelas particionadas do Delta Lake em que a latência de gravação extra é tolerável.
Quando evitá-lo
- Tabelas não particionadas.
- Use casos em que a latência de gravação extra não seja aceitável.
- Tabelas grandes com agendamentos de otimização bem definidos e padrões de leitura.
Como habilitar e desabilitar o recurso de otimização de gravação
O recurso de otimização de gravação está desabilitado por padrão. No Pool do Spark 3.3, ele é habilitado por padrão para tabelas particionadas.
Depois que a configuração for definida para o pool ou sessão, todos os padrões de gravação do Spark usarão a funcionalidade.
Para usar o recurso de otimização de gravação, habilite-o usando a seguinte configuração:
- Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "true")
- Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = true
Para verificar o valor da configuração atual, use o comando conforme mostrado:
- Scala e PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.enabled")
- Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled`
Para desativar o recurso de otimização de gravação, altere a seguinte configuração, conforme mostrado:
- Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "false")
- Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = false
Controlando a otimização da gravação usando as propriedades da tabela
Em novas tabelas
- SQL
CREATE TABLE <table_name> TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
- Scala
Usando a API do DeltaTableBuilder:
val table = DeltaTable.create()
.tableName("<table_name>")
.addColumn("<colName>", <dataType>)
.location("<table_location>")
.property("delta.autoOptimize.optimizeWrite", "true")
.execute()
Em tabelas existentes
- SQL
ALTER TABLE <table_name> SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
- Scala
Usando a API do DeltaTableBuilder
val table = DeltaTable.replace()
.tableName("<table_name>")
.location("<table_location>")
.property("delta.autoOptimize.optimizeWrite", "true")
.execute()
Como obter e alterar a configuração atual do tamanho máximo do arquivo para o Optimize Write
Para obter o valor de configuração atual, use os comandos abaixo. O padrão é 128 MB.
- Scala e PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.binSize")
- SQL
SET `spark.microsoft.delta.optimizeWrite.binSize`
- Para alterar o valor da configuração
- Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.binSize", "134217728")
- SQL
SET `spark.microsoft.delta.optimizeWrite.binSize` = 134217728