Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Comme les systèmes de fichiers et les bases de données relationnelles, les données deviennent fragmentées au fil du temps, sauf si elles sont gérées étroitement, ce qui entraîne des coûts de calcul excessifs pour lire les données. Delta Lake n’est pas une exception. Les fichiers de données doivent être réécrits régulièrement dans une disposition optimale pour réduire les coûts d’opération de fichiers individuels, améliorer la compression des données et optimiser le parallélisme du lecteur. La OPTIMIZE commande répond à ce défi : elle regroupe les petits fichiers d’une partition dans des compartiments ciblant une taille de fichier idéale et les réécrit dans le stockage. Le résultat est les mêmes données compactées en moins de fichiers.
Méthodes de compactage
Microsoft Fabric offre plusieurs approches pour maintenir des tailles de fichiers optimales dans les tables Delta :
Commande OPTIMIZE
La OPTIMIZE commande est l’opération fondamentale pour compacter les tables Delta. Il réécrit de petits fichiers en fichiers plus volumineux pour améliorer la disposition des données dans les tables Delta.
| Propriété | Descriptif | Valeur par défaut | Configuration de session |
|---|---|---|---|
| minFileSize | Les fichiers inférieurs à ce seuil sont regroupés et réécrits en tant que fichiers plus volumineux. | 1073741824 (1 g) | spark.databricks.delta.optimize.minFileSize |
| maxFileSize | Taille de fichier cible produite par la OPTIMIZE commande. |
1073741824 (1g) | spark.databricks.delta.optimize.maxFileSize |
Important
Bien que OPTIMIZE soit une opération idempotente (ce qui signifie que son exécution deux fois de suite ne réécrit pas de données), l'utilisation d'un minFileSize trop grand par rapport à la taille du Delta peut entraîner une amplification de l'écriture, rendant l'opération plus coûteuse en calcul que nécessaire. Par exemple, si votre minFileSize est configuré sur 1 Go et que vous disposez d’un fichier de 900 Mo dans votre table, le fichier de 900 Mo est réécrit lorsque OPTIMIZE est exécuté après avoir écrit un petit fichier de 1 Ko dans votre table. Pour obtenir des conseils sur la gestion automatique de la taille de fichier, consultez la documentation sur la taille de fichier cible adaptative .
OPTIMIZE avec Z-Order
Lorsque la ZORDER BY clause est spécifiée, OPTIMIZE réécrit tous les fichiers actifs afin que les lignes avec des valeurs similaires pour les colonnes de classement z soient colocalisées dans les mêmes fichiers, ce qui améliore l’efficacité du saut de fichier pour les requêtes qui filtrent sur ces colonnes. Utilisez l'Ordre Z quand :
- Vos requêtes filtrent fréquemment sur deux colonnes ou plus (par exemple, date + customer_id) et
- Ces prédicats sont suffisamment sélectifs pour que la réduction au niveau des fichiers diminue le nombre de fichiers analysés.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)
OPTIMIZE avec V-Order
La VORDER clause génère les fichiers délimités pour le compactage avec l’optimisation V-Order appliquée. Pour plus d’informations sur V-Order, consultez la documentation détaillée.
OPTIMIZE dbo.table_name VORDER
OPTIMIZE avec groupement liquide
Le clustering liquide est spécifié en tant qu’option de table ; voir activer le clustering liquide pour plus de détails. Lorsque le clustering liquide est activé, OPTIMIZE effectue la réécriture physique qui applique la stratégie de clustering.
Important
Les données ne sont regroupées que lorsque OPTIMIZE est exécuté sur des tables configurées pour le clustering liquide. Les opérations d’écriture régulières ne clusterent pas les données. L’utilisation d’une stratégie de compactage, telle que l'auto-compactage ou la planification manuelle des travaux d’optimisation, est cruciale pour garantir que les avantages des données en cluster (c'est-à-dire, l’amélioration du saut des fichiers Delta) puissent être pleinement réalisés.
Optimisation rapide
L’optimisation rapide analyse intelligemment les fichiers de table Delta et ignore les opérations de compactage qui ne sont pas susceptibles d’améliorer les performances de manière significative.
Au lieu de compacter aveuglement les fichiers chaque fois que de petits fichiers existent, l’optimisation rapide évalue si chaque bac candidat (groupe de petits fichiers) répond aux objectifs de compactage des meilleures pratiques configurables. Fast Optimize exécute uniquement le compactage sur une corbeille de fichiers si leur fusion est susceptible d’atteindre votre taille cible minimale ou s’il y a trop de petits fichiers. Sinon, il ignore ce groupe ou réduit le nombre de fichiers qu’il compacte.
L’optimisation rapide peut être affinée en fonction de vos attentes de compactage :
| Propriété | Descriptif | Valeur par défaut | Configuration de session |
|---|---|---|---|
| minNumFiles | Nombre de petits fichiers qui doivent exister dans un conteneur pour qu'une optimisation soit effectuée si le conteneur ne contient pas suffisamment de données estimées pour produire un fichier compacté. | 50 | spark.microsoft.delta.optimize.fast.minNumFiles |
| parquetCoefficient | Multiplié par la taille minimale du fichier de contexte optimisé pour déterminer la quantité minimale de données de petits fichiers qui doivent se trouver dans un bac pour que le bac soit inclus dans l'étendue du compactage. | 1.3 | spark.microsoft.delta.optimize.fast.parquetCoefficient |
Note
Le parquetCoefficient a pour résultat que la taille cible d’un bac est supérieure à la taille minimale de fichier cible du contexte d’optimisation. Ce coefficient tient compte du fait que la combinaison de plusieurs petits fichiers parquet entraîne une meilleure compression, et par conséquent, moins de données que la somme des petits fichiers. Cette valeur peut être augmentée pour être plus prudente dans la fréquence à laquelle l’optimisation rapide ignore les bacs, ou diminuée pour autoriser un saut de bacs plus permissif.
Fonctionnement
L’optimisation rapide introduit des vérifications supplémentaires avant que les bacs ne soient compactés. Pour chaque bac candidat, l’optimisation rapide évalue :
- Quantité estimée de données brutes dans la corbeille (somme de petites tailles de fichier)
- Si la combinaison des petits fichiers est estimée pour produire un fichier répondant à la taille cible minimale configurée
- Indique si la corbeille contient au moins le nombre minimal configuré de petits fichiers
L’optimisation rapide évalue chaque compartiment de petits fichiers et compacte uniquement les petits fichiers susceptibles d’atteindre la taille cible minimale ou de dépasser le nombre minimal de fichiers. Les bacs qui ne satisfont pas à ces seuils sont passés outre ou partiellement compactés. Ignorer les compartiments non optimaux réduit les réécritures inutiles, diminue l’amplification d’écriture et rend les travaux « OPTIMIZE » plus idempotents.
Note
L’implémentation exacte est susceptible d’évoluer au fil du temps.
L'optimisation rapide peut entraîner moins de réécritures de données sur un cycle de vie de tables Delta. Comme illustré dans le diagramme suivant, l'optimisation rapide évite de compacter les bacs sous-optimaux. Le résultat net est des travaux OPTIMIZE plus rapides et plus idempotents, avec moins d'amplification d'écriture.
Note
À des fins d’illustration uniquement, les diagrammes ci-dessus supposent que la taille du fichier écrit à partir du compactage est la somme de la taille des petits fichiers. Cela implique également une parquetCoefficient valeur de 1.
Limites
- Non applicable aux opérations de clustering liquide et Z-Order
- L’optimisation rapide ne modifie pas le comportement de compactage automatique
Cibles de compactage au niveau du fichier
Pour éviter la réécriture des données précédemment considérées comme compactées (suffisamment volumineuses) en fonction de la modification des cibles de compactage min et de taille de fichier maximale, spark.microsoft.delta.optimize.fileLevelTarget.enabled peuvent être activées pour empêcher la récompaction des fichiers déjà compactés. Lorsqu’ils sont activés, les fichiers ne sont pas réapprégérés s’ils ont atteint au moins la moitié de la taille de fichier cible au moment du compactage. Maintenir les cibles au niveau du fichier réduit l’amplification de l’écriture à mesure que la taille de la cible de compactage change au fil du temps (par exemple, à partir d'une adaptation de la taille de fichier cible en évaluant et définissant une cible plus grande). Si elle est activée, la balise OPTIMIZE_TARGET_SIZE est ajoutée aux nouveaux fichiers lorsque OPTIMIZE est exécuté ou pour toute opération d'écriture si la propriété de la table delta.targetFileSize ou delta.targetFileSize.adaptive est définie.
Note
Bien qu’il ne soit pas activé par défaut, Microsoft recommande d’activer les cibles de compactage au niveau du fichier pour limiter l’amplification potentielle de l’écriture.
Compactage automatique
Le compactage automatique évalue l’intégrité de la partition après chaque opération d’écriture. Lorsqu’il détecte une fragmentation excessive des fichiers (trop de petits fichiers) dans une partition, il déclenche une opération synchrone OPTIMIZE immédiatement après la validation de l’écriture. Cette approche pilotée par l’enregistreur pour la maintenance des fichiers est optimale, car le compactage s’exécute uniquement lorsqu’il est déterminé par programme comme avantageux.
Définissez au niveau de la session pour activer le compactage automatique sur les nouvelles tables :
Configurez au niveau de la table pour activer uniquement sur certaines tables :
CREATE TABLE dbo.table_name
TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')
Utilisez l'option DataFrameWriter pour activer sur les nouvelles tables :
df.write.option('delta.autoOptimize.autoCompact', 'true').saveAsTable('dbo.table_name')
Activez sur les tables existantes :
ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')
Le comportement de compactage automatique peut être paramétré via les configurations de session Spark suivantes :
| Propriété | Descriptif | Valeur par défaut | Configuration de session |
|---|---|---|---|
| maxFileSize | Taille maximale de fichier cible en octets pour les fichiers compactés. | 134217728b (128 Mo) | spark.databricks.delta.autoCompact.maxFileSize |
| minFileSize | Taille minimale du fichier en octets pour qu’un fichier soit considéré comme compacté. Tout ce qui se trouve en dessous de ce seuil est considéré pour la compaction et compté vers le seuil minNumFiles. |
Non défini par défaut, calculé sous la forme 1/2, maxFileSize sauf si vous définissez explicitement une valeur. |
spark.databricks.delta.autoCompact.minFileSize |
| minNumFiles | Nombre minimal de fichiers qui doivent exister sous le seuil minFileSize pour que le compactage automatique soit déclenché. |
50 | spark.databricks.delta.autoCompact.minNumFiles |
Note
Microsoft recommande d’utiliser le compactage automatique au lieu de planifier OPTIMIZE des travaux. Le compactage automatique dépasse généralement les tâches de compactage planifiées pour maximiser les performances en lecture/écriture et élimine souvent la surcharge de maintenance liée au codage, à la planification et à l'optimisation de la fréquence d'exécution de ces tâches. Le compactage automatique est recommandé lorsque les objectifs de niveau de service de traitement des données tolèrent la latence ajoutée du compactage automatique déclenché lorsque le compactage est nécessaire. Si les exigences de latence des données sont strictes, il peut être plus efficace de planifier l’exécution d’une optimisation sur un pool Spark distinct afin que les opérations d’écriture ne voient pas de pics périodiques en raison des opérations de compactage synchrone déclenchées.
Important
Bien que le compactage soit une stratégie critique à utiliser, il doit également être correctement associé à l’évitement de l’écriture de petits fichiers via des fonctionnalités telles que l’optimisation de l’écriture. Pour plus d’informations, consultez les instructions sur l’optimisation de l’écriture.
Maintenance des tables Lakehouse
Les utilisateurs peuvent exécuter des opérations de maintenance ad hoc comme OPTIMIZE à partir de l’interface utilisateur lakehouse. Pour plus d’informations, consultez la maintenance des tables du lakehouse.
Résumé des bonnes pratiques
-
Activez le compactage automatique pour les pipelines d’ingestion avec de fréquentes petites écritures (streaming ou microbatch) afin d’éviter la planification manuelle et de conserver automatiquement les fichiers compactés.
- Pour d’autres modèles d’écriture, il peut être utile d’activer en tant qu’assurance contre l’accumulation de petits fichiers, mais peser si vos objectifs de niveau de service de traitement des données tolèrent des pics périodiques dans le temps de traitement.
- Planifiez des opérations de table
OPTIMIZEcomplète pendant les fenêtres silencieuses lorsque vous devez réécrire de nombreuses partitions ou exécuter Z-Order. - Activez l’optimisation rapide pour réduire l’amplification de l’écriture et rendre
OPTIMIZEplus idempotente. - Activez les cibles de compactage au niveau du fichier pour empêcher l’amplification de l’écriture à mesure que les tables augmentent en taille et utilisent des tailles de fichiers cibles plus grandes.
- N’oubliez pas que le compactage de préécriture (optimiser l’écriture) est moins coûteux que le compactage post-écriture (optimise). Consultez la documentation d’optimisation de l’écriture pour connaître les meilleures pratiques.