La necesidad de optimizar la escritura en Apache Spark

Las cargas de trabajo analíticas en motores de procesamiento de macrodatos, como Apache Spark, funcionan de forma más eficaz al usar tamaños de archivo más grandes estandarizados. La relación entre el tamaño del archivo, el número de archivos, el número de trabajos de Spark y sus configuraciones desempeña un papel fundamental en el rendimiento. Las cargas de trabajo de ingesta en tablas de lago de datos pueden tener la característica heredada de escribir constantemente muchos archivos pequeños; este escenario se conoce normalmente como "problema de archivo pequeño".

Optimizar escritura es una característica de Delta Lake en Synapse que reduce el número de archivos escritos y tiene como objetivo aumentar el tamaño de archivo individual de los datos escritos. Optimiza dinámicamente las particiones al generar archivos con un tamaño predeterminado de 128 MB. El tamaño del archivo de destino se puede cambiar según los requisitos de carga de trabajo mediante configuraciones.

Esta característica logra el tamaño del archivo mediante una fase de ofuscación de datos adicional en las particiones, lo que provoca un coste de procesamiento adicional mientras se escriben los datos. La pequeña penalización de escritura debería compensarse con la eficacia de lectura en las tablas.

Nota

  • Está disponible en grupos de Synapse para versiones de Apache Spark superiores a la 3.1.

Ventajas de optimizar las escrituras

  • Está disponible en tablas de Delta Lake para los patrones de escritura de Batch y Streaming.
  • No es necesario cambiar el patrón de comando spark.write. La característica está habilitada mediante un valor de configuración o una propiedad de tabla.
  • Reduce el número de transacciones de escritura en comparación con el comando OPTIMIZE.
  • Las operaciones OPTIMIZE serán más rápidas, ya que funcionarán en menos archivos.
  • El comando VACUUM para la eliminación de archivos antiguos sin referencia también funcionará más rápido.
  • Las consultas examinarán menos archivos con tamaños de archivo más óptimos, lo que mejorará el rendimiento de lectura o el uso de recursos.

Escenarios de uso de optimización de escritura

Cuándo se debe usar

  • Tablas con particiones de Delta Lake sujetas a patrones de escritura que generan tamaños poco óptimos (menos de 128 MB) o archivos no estandarizados (archivos con tamaños diferentes entre sí).
  • Tramas de datos reparticionadas que se escribirán en el disco con un tamaño de archivos poco óptimo.
  • Tablas con particiones de Delta Lake destinadas a comandos SQL por lotes pequeños, como UPDATE, DELETE, MERGE, CREATE TABLE AS SELECT, INSERT INTO, etc.
  • Escenarios de ingesta de streaming con patrones de datos anexados a tablas con particiones de Delta Lake en las que la latencia de escritura adicional es tolerable.

Cuándo evitarlo

  • Tablas sin particiones.
  • Casos de uso en los que la latencia de escritura adicional no es aceptable.
  • Tablas grandes con programaciones de optimización y patrones de lectura bien definidos.

Habilitación y deshabilitación de la característica de optimización de escritura

La característica de optimización de escritura está deshabilitada de forma predeterminada. En el grupo de Spark 3.3, está habilitado de forma predeterminada para las tablas con particiones.

Una vez establecida la configuración para el grupo o la sesión, todos los patrones de escritura de Spark usarán la funcionalidad.

Para usar la característica de optimización de escritura, habilítela con la siguiente configuración:

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

Para comprobar el valor de configuración actual, use el comando como se muestra a continuación:

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

Para deshabilitar la característica de optimización de escritura, cambie la siguiente configuración, como se muestra a continuación:

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

Control de la optimización de la escritura mediante propiedades de tabla

En tablas nuevas

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

Uso de DeltaTableBuilder API:

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

En tablas existentes

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

Uso de DeltaTableBuilder API

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

Cómo obtener y cambiar la configuración actual del tamaño máximo de archivo para Optimizar escritura

Para obtener el valor de configuración actual, use los comandos siguientes. El valor predeterminado es 128 MB.

  1. Scala y PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.binSize")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize`
  • Para cambiar el valor de configuración
  1. Scala y PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.binSize", "134217728")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize` = 134217728

Pasos siguientes