Configuración de Delta Lake para controlar el tamaño del archivo de datos

Nota:

Las recomendaciones de este artículo no se aplican a las tablas administradas de Unity Catalog. Databricks recomienda el uso de las tablas administradas de Unity Catalog con una configuración predeterminada en todas las nuevas tablas delta.

Tanto en Databricks Runtime 13.3 como en las versiones posteriores, Databricks recomienda usar la agrupación en clústeres para el diseño de tabla Delta. Consulte Uso de clústeres líquidos para tablas Delta.

Databricks recomienda usar la optimización predictiva para ejecutar automáticamente OPTIMIZE y VACUUM para las tablas Delta. Consulte Optimización predictiva para tablas administradas de Unity Catalog.

En Databricks Runtime 10.4 LTS y versiones posteriores, la compactación automática y las escrituras optimizadas siempre están habilitadas para las operaciones MERGE, UPDATE y DELETE. No puede deshabilitar esta funcionalidad.

Delta Lake proporciona opciones para configurar manualmente o automáticamente el tamaño del archivo de destino para las escrituras y para las operaciones OPTIMIZE. Azure Databricks ajusta automáticamente muchas de estas opciones de configuración y habilita características que mejoran automáticamente el rendimiento de las tablas mediante la búsqueda de archivos de tamaño correcto.

En el caso de las tablas administradas por Unity Catalog, Databricks ajusta la mayoría de estas opciones de configuración automáticamente si usa un almacén de SQL o Databricks Runtime 11.3 LTS o superior.

Si va a actualizar una carga de trabajo desde Databricks Runtime 10.4 LTS o a continuación, consulte Actualización a la compactación automática en segundo plano.

Cuándo se debe ejecutar OPTIMIZE

La compactación automática y las escrituras optimizadas reducen los problemas de archivos pequeños, pero no son un reemplazo completo de OPTIMIZE. Especialmente para las tablas de más de 1 TB, Databricks recomienda ejecutar OPTIMIZE según una programación para consolidar aún más los archivos. Azure Databricks no ejecuta automáticamente ZORDER en las tablas, por lo que debe ejecutarse OPTIMIZE con ZORDER para habilitar la omisión de datos mejorada. Consulte Omisión de datos para Delta Lake.

¿Qué es la optimización automática en Azure Databricks?

El término optimización automática se usa a veces para describir la funcionalidad controlada por la configuración delta.autoOptimize.autoCompact y delta.autoOptimize.optimizeWrite. Este término se ha retirado en favor de describir cada configuración individualmente. Consulte Compactación automática para Delta Lake en Azure Databricks y Escrituras optimizadas para Delta Lake en Azure Databricks.

Compactación automática de Delta Lake en Azure Databricks

La compactación automática combina archivos pequeños dentro de las particiones de tabla Delta para reducir automáticamente los problemas de archivos pequeños. La compactación automática se produce después de que una escritura en una tabla se haya realizado correctamente y se ejecute sincrónicamente en el clúster que ha realizado la escritura. La compactación automática solo compacta los archivos que no se han compactado anteriormente.

Para controlar el tamaño del archivo de salida, establezca la configuración de Spark spark.databricks.delta.autoCompact.maxFileSize. Databricks recomienda usar el ajuste automático en función de la carga de trabajo o el tamaño de la tabla. Consulte Ajuste automático del tamaño de archivo en función de la carga de trabajo y Ajuste automático del tamaño del archivo en función del tamaño de la tabla.

La compactación automática solo se desencadena para particiones o tablas que tienen al menos un número determinado de archivos pequeños. De manera opcional, puede cambiar el número mínimo de archivos necesarios para desencadenar la compactación automática estableciendo spark.databricks.delta.autoCompact.minNumFiles.

La compactación automática se puede habilitar en el nivel de tabla o de sesión mediante la siguiente configuración:

  • Propiedad de tabla: delta.autoOptimize.autoCompact
  • Configuración de SparkSession: spark.databricks.delta.autoCompact.enabled

Esta configuración acepta las siguientes opciones:

Opciones Comportamiento
auto (recomendado) Ajusta el tamaño del archivo de destino al tiempo que respeta otras funcionalidades de ajuste automático. Requiere Databricks Runtime 10.4 LTS o superior.
legacy Alias para true. Requiere Databricks Runtime 10.4 LTS o superior.
true Use 128 MB como tamaño de archivo de destino. Sin dimensionamiento dinámico.
false Desactiva la compactación automática. Se puede establecer en el nivel de sesión para invalidar la compactación automática de todas las tablas Delta modificadas en la carga de trabajo.

Importante

En Databricks Runtime 9.1 LTS, cuando otros escritores realizan operaciones como DELETE, MERGE, UPDATE, o OPTIMIZE simultáneamente, la compactación automática puede hacer que esos otros trabajos produzcan un error en un conflicto de transacciones. Esto no es un problema en Databricks Runtime 10.4 LTS y versiones posteriores.

Escrituras optimizadas para Delta Lake en Azure Databricks

Las escrituras optimizadas mejoran el tamaño de archivo a medida que se escriben los datos y benefician las lecturas posteriores en la tabla.

Las escrituras optimizadas son más eficaces para las tablas con particiones, ya que reducen el número de archivos pequeños escritos en cada partición. Escribir menos archivos grandes es más eficaz que escribir muchos archivos pequeños, pero es posible que todavía vea un aumento en la latencia de escritura porque los datos se ordenan aleatoriamente antes de escribirse.

En la imagen siguiente se muestra cómo funcionan las escrituras optimizadas:

Escrituras optimizadas

Nota:

Es posible que tenga código que ejecute coalesce(n) o repartition(n) justo antes de escribir los datos para controlar el número de archivos escritos. Las escrituras optimizadas eliminan la necesidad de usar este patrón.

Las escrituras optimizadas están habilitadas de forma predeterminada para las siguientes operaciones en Databricks Runtime 9.1 LTS y versiones posteriores:

  • MERGE
  • UPDATE con subconsultas
  • DELETE con subconsultas

Las escrituras optimizadas también se habilitan para las sentencias CTAS y las operaciones INSERT cuando se utilizan almacenes SQL. En Databricks Runtime 13.3 LTS y versiones posteriores, todas las tablas Delta registradas en Unity Catalog tienen habilitadas escrituras optimizadas para instrucciones CTAS y operaciones INSERT para tablas con particiones.

Las escrituras optimizadas se pueden habilitar en el nivel de tabla o de sesión mediante la siguiente configuración:

  • Configuración de tabla: delta.autoOptimize.optimizeWrite
  • Configuración de SparkSession: spark.databricks.delta.optimizeWrite.enabled

Esta configuración acepta las siguientes opciones:

Opciones Comportamiento
true Use 128 MB como tamaño de archivo de destino.
false Desactiva las escrituras optimizadas. Se puede establecer en el nivel de sesión para invalidar la compactación automática de todas las tablas Delta modificadas en la carga de trabajo.

Establecer un tamaño de archivo de destino

Si quiere ajustar el tamaño de los archivos de una tabla de Delta, establezca la propiedad table delta.targetFileSize en el tamaño deseado. Si se establece esta propiedad, todas las operaciones de optimización del diseño de datos harán todo lo posible por generar archivos del tamaño especificado. Algunos ejemplos incluyen optimización u orden Z, compactación automática y escrituras optimizadas.

Nota:

Al usar tablas administradas por Unity Catalog y almacenes de SQL o Databricks Runtime 11.3 LTS y versiones posteriores, solo los comandos OPTIMIZE respetan la configuración targetFileSize.

Propiedad de tabla
delta.targetFileSize

Tipo: Tamaño en bytes o unidades superiores.

Tamaño del archivo de destino. Por ejemplo, 104857600 (bytes) o 100mb.

Valor predeterminado: ninguno

En el caso de las tablas existentes, puede establecer y anular la configuración de propiedades mediante el comando SQL ALTER TABLE SET TBL PROPERTIES. Además, puede establecer estas propiedades automáticamente al crear nuevas tablas mediante configuraciones de sesión de Spark. Consulte Referencia de las propiedades de la tabla Delta para más información.

Ajuste automático del tamaño del archivo en función de la carga de trabajo

Databricks recomienda establecer la propiedad de tabla delta.tuneFileSizesForRewrites en true para todas las tablas que son destino de muchas operaciones DML o MERGE, independientemente de Databricks Runtime, Unity Catalog u otras optimizaciones. Cuando se establece en true, el tamaño del archivo de destino de la tabla se establece en un umbral mucho menor, lo que acelera las operaciones de escritura intensiva.

Si no se establece explícitamente, Azure Databricks detecta automáticamente si 9 de las últimas 10 operaciones anteriores en una tabla Delta eran operaciones MERGE y establece esta propiedad de tabla en true. Debe establecer explícitamente esta propiedad en false para evitar este comportamiento.

Propiedad de tabla
delta.tuneFileSizesForRewrites

Escriba: Boolean

Si se deben ajustar los tamaños de archivo para la optimización del diseño de los datos.

Valor predeterminado: ninguno

En el caso de las tablas existentes, puede establecer y anular la configuración de propiedades mediante el comando SQL ALTER TABLE SET TBL PROPERTIES. Además, puede establecer estas propiedades automáticamente al crear nuevas tablas mediante configuraciones de sesión de Spark. Consulte Referencia de las propiedades de la tabla Delta para más información.

Ajuste automático del tamaño del archivo en función del tamaño de tabla

Para minimizar la necesidad de ajustes manuales, Azure Databricks ajusta automáticamente el tamaño de archivo de las tablas de Delta en función del tamaño de la tabla. Azure Databricks usará tamaños de archivo más pequeños para tablas más pequeñas, y tamaños de archivo más grandes para tablas más grandes, de modo que el número de archivos de la tabla no crezca demasiado. Azure Databricks no ajusta automáticamente las tablas que ha ajustado con un tamaño de destino específico ni en función de una carga de trabajo con reescrituras frecuentes.

El tamaño del archivo de destino se basa en el tamaño actual de la tabla de Delta. En el caso de las tablas de menos de 2,56 TB, el tamaño del archivo de destino con ajuste automático es de 256 MB. En el caso de las tablas con un tamaño entre 2,56 TB y 10 TB, el tamaño objetivo crecerá linealmente de 256 MB a 1 GB. Para las tablas de más de 10 TB, el tamaño del archivo de destino es de 1 GB.

Nota:

Cuando aumenta el tamaño del archivo de destino para una tabla, el comando OPTIMIZE no vuelve a optimizar los archivos existentes en archivos más grandes. Por lo tanto, una tabla grande siempre puede tener algunos archivos que sean menores que el tamaño de destino. Si también es necesario optimizar esos archivos más pequeños en archivos más grandes, puede configurar un tamaño fijo para el archivo de destino para la tabla mediante la propiedad de tabla delta.targetFileSize.

Cuando una tabla se escribe de forma incremental, los tamaños de los archivos de destino y los recuentos de archivos se acercarán a los siguientes números, según el tamaño de la tabla. Los recuentos de archivos de esta tabla son solo un ejemplo. Los resultados reales serán diferentes en función de muchos factores.

Tamaño de la tabla Tamaño del archivo de destino Número aproximado de archivos en la tabla
10 GB 256 MB 40
1 TB 256 MB 4096
2,56 TB* 256 MB 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 las filas escritas en un fichero de datos

Ocasionalmente, se puede encontrar un error en las tablas con datos reducidos que indica que el número de filas de un archivo de datos determinado supera los límites de compatibilidad del formato Parquet. Para evitar este error, puede usar la configuración spark.sql.files.maxRecordsPerFile de la sesión de SQL para especificar el número máximo de registros que se van a escribir en un único archivo para una tabla de Delta Lake. Especificar un valor de cero o un valor negativo no representa ningún límite.

En Databricks Runtime 11.3 LTS y versiones posteriores, también puede usar la opción DataFrameWriter maxRecordsPerFile al usar las API de DataFrame para escribir en una tabla de Delta Lake. Cuando se especifica maxRecordsPerFile, se omite el valor de la configuración spark.sql.files.maxRecordsPerFile de la sesión de SQL.

Nota:

Databricks no recomienda usar esta opción a menos que sea necesario evitar el error mencionado anteriormente. Esta configuración puede seguir siendo necesaria para algunas tablas administradas de Unity Catalog con datos muy reducidos.

Actualización a la compactación automática en segundo plano

La compactación automática en segundo plano está disponible para las tablas administradas de Unity Catalog en Databricks Runtime 11.3 LTS y versiones posteriores. Al migrar una carga de trabajo o tabla heredadas, haga lo siguiente:

  • Quite la configuración de Spark spark.databricks.delta.autoCompact.enabled de los valores de configuración del clúster o del cuaderno.
  • Para cada tabla, ejecute ALTER TABLE <table_name> UNSET TBLPROPERTIES (delta.autoOptimize.autoCompact) para quitar cualquier configuración de compactación automática heredada.

Después de quitar estas configuraciones heredadas, debería ver que la compactación automática en segundo plano se desencadenó automáticamente para todas las tablas administradas por Unity Catalog.