Compartir a través de


Compactación de tablas delta

Al igual que los sistemas de archivos y las bases de datos relacionales, los datos se fragmentan a lo largo del tiempo a menos que se administren estrechamente, lo que conduce a costos excesivos de proceso para leer los datos. Delta Lake no es una excepción. Los archivos de datos deben reescribirse periódicamente en un diseño óptimo para reducir los costos individuales de las operaciones de archivo, mejorar la compresión de datos y optimizar el paralelismo del lector. El OPTIMIZE comando aborda este desafío: agrupa archivos pequeños dentro de una partición en contenedores destinados a un tamaño de archivo ideal y los vuelve a escribir en el almacenamiento. El resultado es los mismos datos compactados en menos archivos.

Métodos de compactación

Microsoft Fabric ofrece varios enfoques para mantener los tamaños de archivo óptimos en tablas Delta:

Comando OPTIMIZE

El OPTIMIZE comando es la operación fundamental para compactar tablas Delta. Vuelve a escribir archivos pequeños en archivos más grandes para mejorar el diseño de datos en tablas Delta.

OPTIMIZE dbo.table_name
Propiedad Description Valor predeterminado Configuración de sesión
minFileSize Los archivos que son más pequeños que este umbral se agrupan y se vuelven a escribir como archivos más grandes. 1073741824 (1 g) spark.databricks.delta.optimize.minFileSize
maxFileSize Tamaño del archivo de destino generado por el OPTIMIZE comando . 1073741824 (1g) spark.databricks.delta.optimize.maxFileSize

Importante

Aunque OPTIMIZE es una operación idempotente (lo que significa que ejecutarlo dos veces en una fila no vuelve a escribir ningún dato), el uso de un minFileSize que es demasiado grande en relación con el tamaño de la tabla Delta podría provocar amplificación de escritura, lo que hace que la operación sea más costosa computacionalmente de lo necesario. Por ejemplo, si minFileSize se establece en 1 GB y tiene un archivo de 900 MB en la tabla, el archivo de 900 MB de tamaño razonable se reescribe cuando OPTIMIZE se ejecuta después de escribir un archivo pequeño de 1 KB en la tabla. Para obtener instrucciones sobre cómo administrar automáticamente el tamaño de archivo, consulte la documentación sobre el tamaño de archivo de destino adaptable .

OPTIMIZE con Z-Order

Cuando se especifica la ZORDER BY cláusula, OPTIMIZE vuelve a escribir todos los archivos activos para que las filas con valores similares para las columnas de z-order se coloquen en los mismos archivos, lo que mejora la eficacia del salto de archivos para las consultas que filtran en esas columnas. Utilice Z-Order cuando:

  • Las consultas filtran con frecuencia dos o más columnas juntas (por ejemplo, fecha + customer_id) y
  • Esos predicados son lo suficientemente selectivos como para que la omisión en el nivel de archivo reduzca el número de archivos examinados.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)

OPTIMIZE con orden V

La VORDER cláusula da como resultado los archivos objeto de compactación a los que se les ha aplicado la optimización de orden V. Para más información sobre V-Order, consulte la documentación detallada.

OPTIMIZE dbo.table_name VORDER

OPTIMIZE con agrupación en clústeres líquidos

La agrupación en clústeres líquidos se especifica como opción de tabla; consulte Habilitación de la agrupación en clústeres líquidos para obtener más información. Cuando se habilita la agrupación en clústeres líquidos, OPTIMIZE realiza la reescritura física que aplica la directiva de agrupación en clústeres.

Importante

Los datos solo se agrupan cuando OPTIMIZE se ejecuta en tablas habilitadas para liquid clustering. Las operaciones de escritura normales NO agrupan los datos. Contar con una estrategia de compactación, como el uso de la compactación automática o la programación manual de trabajos de optimización, es fundamental para garantizar que se puedan aprovecharse las ventajas de los datos agrupados (es decir, mejorar la omisión de archivos Delta).

Optimización rápida

Optimización rápida analiza inteligentemente los archivos de tabla Delta y omite las operaciones de compactación que probablemente no mejorarán significativamente el rendimiento.

En lugar de compactar los archivos de forma ciega cada vez que existan archivos pequeños, la optimización rápida evalúa si cada contenedor candidato (grupo de archivos pequeños) cumple los objetivos de compactación de procedimientos recomendados configurables. Fast Optimize solo ejecuta la compactación en un conjunto de archivos si al combinarlos es probable que alcancen su tamaño mínimo objetivo o si hay demasiados archivos pequeños. De lo contrario, omite ese grupo o reduce el número de archivos que compacta.

SET spark.microsoft.delta.optimize.fast.enabled = TRUE

La función Fast Optimize puede afinarse basándose en tus expectativas específicas de compactación.

Propiedad Description Valor predeterminado Configuración de sesión
minNumFiles Número de archivos pequeños que deben existir en un contenedor para que se realice la optimización si el contenedor no contiene suficientes datos estimados para generar un archivo compactado . 50 spark.microsoft.delta.optimize.fast.minNumFiles
parquetCoefficient Multiplicado por el tamaño mínimo de archivo de contexto optimizado para determinar la cantidad mínima de datos de archivo pequeños que deben existir en un contenedor para que el contenedor se incluya en el ámbito de compactación. 1.3 spark.microsoft.delta.optimize.fast.parquetCoefficient

Nota:

El parquetCoefficient da como resultado que el tamaño objetivo de un bin sea mayor que el tamaño objetivo mínimo de archivo en el contexto de optimización. Este coeficiente tiene en cuenta la realidad de que combinar varios archivos parquet pequeños da como resultado una mejor compresión y, por tanto, menos datos que la suma de archivos pequeños. Este valor se puede aumentar para ser más conservador en la frecuencia con la que la optimización rápida omitirá los contenedores o disminuirá para permitir que se omitan más contenedores permisivos.

Cómo funciona

La optimización rápida presenta comprobaciones adicionales antes de compactar los contenedores. Para cada cubo candidato, la optimización rápida evalúa:

  • Cantidad estimada de datos sin procesar en el contenedor (suma de tamaños de archivo pequeños)
  • Ya sea que combinar los archivos pequeños se estime que producirá un archivo que cumpla con el tamaño mínimo de destino configurado.
  • Si el contenedor contiene al menos el número mínimo configurado de archivos pequeños

La optimización rápida evalúa cada contenedor de archivos pequeños y solo compacta los archivos pequeños que probablemente alcancen el tamaño de destino mínimo o supere el número mínimo de archivos. Los contenedores que no alcanzan estos umbrales se pasan por alto o se compactan parcialmente. La omisión de contenedores poco óptimos reduce las reescrituras innecesarias, reduce la amplificación de escritura y hace que los trabajos OPTIMIZE sean más idempotentes.

Captura de pantalla en la que se muestra cómo se evalúa la optimización rápida si se compacta un contenedor.

Nota:

La implementación exacta está sujeta a una evolución a lo largo del tiempo.

La optimización rápida puede dar lugar a que se reescriba una menor cantidad de datos durante el ciclo de vida de las tablas Delta. Como se ilustra en el diagrama siguiente, la optimización rápida evita la compactación de contenedores subóptimos. Esto da como resultado un procesamiento más rápido y trabajos idempotentes OPTIMIZE, así como una menor amplificación de escritura.

Captura de pantalla que muestra la rapidez con la que la optimización da como resultado menos reescritura de datos a lo largo del tiempo.

Nota:

Solo con fines ilustrativos, los diagramas anteriores asumen que el tamaño del archivo escrito a partir de la compactación es la suma del tamaño de los archivos pequeños. También implica un parquetCoefficient de 1.

Limitaciones
  • No es aplicable a las operaciones de agrupación en clústeres líquidos y orden Z
  • La optimización rápida no modifica el comportamiento de la compactación automática

Destinos de compactación de nivel de archivo

Para evitar la recompilación de los datos que se consideraron previamente como compactados (lo suficientemente grandes) basándose en un cambio en los objetivos de tamaño mínimo y máximo de archivo, se puede habilitar spark.microsoft.delta.optimize.fileLevelTarget.enabled para evitar la recompilación de archivos que ya habían sido compactados. Cuando está habilitado, los archivos no se vuelven a compactar si anteriormente cumplían al menos la mitad del tamaño objetivo del archivo en el momento de la recompresión. El mantenimiento de destinos a nivel de archivo minimiza la amplificación de escritura a medida que cambia el tamaño del objetivo de compactación a lo largo del tiempo (por ejemplo, evaluando el tamaño del archivo de destino adaptable y estableciendo un objetivo mayor). Si está habilitado, la etiqueta OPTIMIZE_TARGET_SIZE se agrega a nuevos archivos cuando se ejecuta OPTIMIZE o para cualquier operación de escritura si se establece la propiedad delta.targetFileSize o la tabla delta.targetFileSize.adaptive.

Nota:

Aunque no está habilitado de forma predeterminada, Microsoft recomienda habilitar destinos de compactación de nivel de archivo para limitar la posible amplificación de escritura.

SET spark.microsoft.delta.optimize.fileLevelTarget.enabled = TRUE

Compactación automática

La compactación automática evalúa el estado de la partición después de cada operación de escritura. Cuando detecta una fragmentación excesiva de archivos (demasiados archivos pequeños) dentro de una partición, desencadena una operación sincrónica OPTIMIZE inmediatamente después de confirmar la escritura. Este enfoque controlado por el sistema de escritura para el mantenimiento de archivos es óptimo porque la compactación solo se ejecuta cuando se determina mediante programación que es beneficioso.

Establecer a nivel de sesión para habilitar la compactación automática en tablas nuevas

SET spark.databricks.delta.autoCompact.enabled = TRUE

Establezca en el nivel de tabla para habilitar solo para las tablas seleccionadas:

CREATE TABLE dbo.table_name
TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Use la opción DataFrameWriter para habilitar en tablas nuevas:

df.write.option('delta.autoOptimize.autoCompact', 'true').saveAsTable('dbo.table_name')

Habilitar en tablas existentes:

ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

El comportamiento de la compactación automática se puede ajustar mediante las siguientes configuraciones de sesión de Spark:

Propiedad Description Valor predeterminado Configuración de sesión
maxFileSize Tamaño máximo de archivo de destino en bytes para archivos compactos. 134217728b (128 MB) spark.databricks.delta.autoCompact.maxFileSize
minFileSize Tamaño mínimo de archivo en bytes para un archivo que se va a considerar compacto. Todo lo que esté por debajo de este umbral se considera para la compactación y se cuenta hacia el minNumFiles umbral. No configurado por defecto, se calcula como 1/2 del maxFileSize a menos que establezca explícitamente un valor. spark.databricks.delta.autoCompact.minFileSize
minNumFiles El número mínimo de archivos que deben existir bajo el minFileSize umbral para que se desencadene la compactación automática. 50 spark.databricks.delta.autoCompact.minNumFiles

Nota:

Microsoft recomienda usar la compactación automática en lugar de programar OPTIMIZE trabajos. La compactación automática generalmente supera los trabajos de compactación programados al maximizar el rendimiento de lectura y escritura y, a menudo, elimina la sobrecarga de mantenimiento de la codificación, la programación y la optimización de la frecuencia de ejecución de trabajos programados. Se recomienda la compactación automática cuando los objetivos de nivel de servicio de procesamiento de datos toleran la latencia agregada de la compactación automática que se desencadena cuando se necesita la compactación. Si los requisitos de latencia de datos son estrictos, puede ser más eficaz programar la optimización para que se ejecute en un grupo de Spark independiente para que las operaciones de escritura no vean picos periódicos debido a las operaciones de compactación sincrónicas que se desencadenan.

Importante

Aunque la compactación es una estrategia crítica para emplear, también debe emparejarse adecuadamente con la prevención de escribir archivos pequeños a través de características como optimizar la escritura. Para obtener más información, consulte las instrucciones para optimizar la escritura.

Mantenimiento de tablas de almacén de lago

Los usuarios pueden ejecutar operaciones de mantenimiento ad hoc como OPTIMIZE desde la interfaz de usuario de Lakehouse. Para obtener más información, consulte lakehouse table maintenance ( Mantenimiento de tablas de Lakehouse).

Resumen de los procedimientos recomendados

  • Habilite la compactación automática para canalizaciones de ingesta con escrituras pequeñas frecuentes (streaming o microbatch) para evitar la programación manual y mantener los archivos compactados automáticamente.
    • Para otros patrones de escritura, puede ser beneficioso habilitar como seguro contra la acumulación de archivos pequeños, pero pesar si los objetivos de nivel de servicio de procesamiento de datos toleran picos periódicos en el tiempo de procesamiento.
  • Programe operaciones de tabla OPTIMIZE completa durante las ventanas silenciosas cuando necesite reescribir muchas particiones o ejecutar Z-Order.
  • Habilite la optimización rápida para reducir la amplificación de escritura y hacer OPTIMIZE más idempotente.
  • Habilite los destinos de compactación de nivel de archivo para evitar la amplificación de escritura a medida que las tablas aumentan de tamaño y usan tamaños de archivo de destino mayores.
  • Recuerde que la compactación previa (optimización de escritura) es menos costosa que la compactación posterior a la escritura (optimización). Consulte la documentación de optimizar escritura para conocer los procedimientos recomendados.