A necessidade de otimizar a escrita 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 trabalhadores do Spark e suas configurações, desempenham um papel crítico no desempenho. A ingestão de cargas de trabalho em tabelas de data lake pode ter a característica herdada de escrever constantemente muitos arquivos pequenos; Este cenário é comumente conhecido como o "problema de arquivo pequeno".

Otimize Write é um recurso Delta Lake on Synapse que reduz o número de arquivos gravados e visa aumentar o tamanho do arquivo individual dos dados gravados. Ele otimiza dinamicamente 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 sobre partições, causando um custo de processamento extra durante a gravação dos dados. A pequena penalidade de escrita deve ser superada pela eficiência de leitura nas tabelas.

Nota

  • Está disponível em Synapse Pools para versões do Apache Spark acima de 3.1.

Benefícios de otimizar gravações

  • Está disponível em tabelas Delta Lake para padrões de gravação em lote e streaming.
  • Não há necessidade de alterar o spark.write padrão de comando. O recurso é habilitado por uma definição de configuração ou uma propriedade de tabela.
  • Ele reduz o número de transações de gravação em comparação com o comando OTIMIZE.
  • As operações OTIMIZE serão mais rápidas, pois operarã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 Utilizar

  • Tabelas particionadas Delta lake sujeitas a padrões de gravação que geram tamanhos de arquivos subótimos (menos de 128 MB) ou não padronizados (arquivos com tamanhos diferentes entre si).
  • Quadros de dados reparticionados que serão gravados no disco com tamanho de arquivo abaixo do ideal.
  • Tabelas particionadas Delta lake direcionadas por comandos SQL em pequenos lotes como UPDATE, DELETE, MERGE, CREATE TABLE AS SELECT, INSERT INTO, etc.
  • Cenários de ingestão de streaming com padrões de dados anexados a tabelas particionadas do lago Delta onde a latência de gravação extra é tolerável.

Quando evitá-lo

  • Tabelas não particionadas.
  • Casos de uso em que a latência de gravação extra não é aceitável.
  • Grandes tabelas com cronogramas de otimização bem definidos e padrões de leitura.

Como ativar e desativar o recurso otimizar gravação

O recurso otimizar gravação está desativado 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 otimizar gravação, habilite-o usando a seguinte configuração:

  1. Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "true")
  1. SQL do Apache Spark
SET `spark.microsoft.delta.optimizeWrite.enabled` = true

Para verificar o valor de configuração atual, use o comando conforme mostrado:

  1. Scala e PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.enabled")
  1. SQL do Apache Spark
SET `spark.microsoft.delta.optimizeWrite.enabled`

Para desativar o recurso otimizar gravação, altere a seguinte configuração conforme mostrado:

  1. Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "false")
  1. SQL do Apache Spark
SET `spark.microsoft.delta.optimizeWrite.enabled` = false

Controlando otimizar a gravação usando propriedades de tabela

Em novas tabelas

  1. SQL
CREATE TABLE <table_name> TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
  1. Scala

Usando a API do DeltaTableBuilder:

val table = DeltaTable.create()
  .tableName("<table_name>")
  .addColumnn("<colName>", <dataType>)
  .location("<table_location>")
  .property("delta.autoOptimize.optimizeWrite", "true") 
  .execute()

Nos quadros existentes

  1. SQL
ALTER TABLE <table_name> SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
  1. Scala

Usando a API do DeltaTableBuilder

val table = DeltaTable.replace()
  .tableName("<table_name>")
  .location("<table_location>")
  .property("delta.autoOptimize.optimizeWrite", "true") 
  .execute()

Como obter & alterar a configuração atual de tamanho máximo de arquivo para Otimizar gravação

Para obter o valor de configuração atual, use os comandos abaixo. O padrão é 128 MB.

  1. Scala e PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.binSize")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize`
  • Para alterar o valor de configuração
  1. Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.binSize", "134217728")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize` = 134217728

Próximos passos