Optimisation automatique

L’optimisation automatique est un ensemble facultatif de fonctionnalités qui compactent automatiquement des fichiers de petite taille pendant les écritures individuelles dans une table Delta. Le paiement d’un coût réduit pendant les écritures offre des avantages significatifs pour les tables interrogées activement. L’optimisation automatique est particulièrement utile dans les scénarios suivants :

  • Les cas d’utilisation en continu où la latence dans l’ordre des minutes est acceptable
  • MERGE INTO est la méthode recommandée pour écrire dans Delta Lake
  • CREATE TABLE AS SELECT ou INSERT INTO sont des opérations couramment utilisées

Fonctionnement de l’optimisation automatique

L’optimisation automatique est constituée de deux fonctionnalités complémentaires : les écritures optimisées et la compression automatique.

Fonctionnement des écritures optimisées

Azure Databricks optimise dynamiquement Apache Spark tailles de partition en fonction des données réelles et tente d’écrire des fichiers de 128 Mo pour chaque partition de table. Il s’agit d’une taille approximative qui peut varier en fonction des caractéristiques du jeu de données.

Écritures optimisées

Fonctionnement de la compression automatique

Après une seule écriture, Azure Databricks vérifie si les fichiers peuvent encore être compactés et exécute un OPTIMIZE travail (avec des tailles de fichier de 128 Mo OPTIMIZE) pour mieux compacter les fichiers pour les partitions qui contiennent le plus grand nombre de fichiers de petite taille.

Activer l’optimisation automatique

Vous devez activer explicitement les écritures optimisées et la compression automatique à l’aide de l’une des méthodes suivantes :

  • Nouvelle table: définissez les propriétés de la table et delta.autoOptimize.autoCompact = true dans la CREATE TABLE commande.

    CREATE TABLE student (id INT, name STRING, age INT) TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true, delta.autoOptimize.autoCompact = true)
    
  • Tables existantes: définissez les propriétés de la table et delta.autoOptimize.autoCompact = true dans la ALTER TABLE commande.

    ALTER TABLE [table_name | delta.`<table-path>`] SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true, delta.autoOptimize.autoCompact = true)
    
  • Toutes les nouvelles tables:

    set spark.databricks.delta.properties.defaults.autoOptimize.optimizeWrite = true;
    set spark.databricks.delta.properties.defaults.autoOptimize.autoCompact = true;
    

Dans Databricks Runtime 10,1 et versions ultérieures, la propriété de table delta.autoOptimize.autoCompact accepte également les valeurs auto et legacy en plus de true et false . Quand la valeur est auto (recommandé), la compression automatique utilise de meilleures valeurs par défaut, comme la définition de 32 Mo comme taille de fichier cible (bien que les comportements par défaut soient susceptibles de changer à l’avenir). Quand la valeur est legacy ou true , la compression automatique utilise 128 Mo comme taille de fichier cible.

En outre, vous pouvez activer et désactiver ces deux fonctionnalités pour les sessions Spark avec les configurations :

  • spark.databricks.delta.optimizeWrite.enabled
  • spark.databricks.delta.autoCompact.enabled

Les configurations de session ont priorité sur les propriétés de la table, ce qui vous permet de mieux contrôler le moment où vous devez accepter ou refuser ces fonctionnalités.

Quand accepter ou refuser

Cette section fournit des conseils sur la façon d’accepter et de refuser les fonctionnalités d’optimisation automatique.

Quand s’abonner à des écritures optimisées

Les écritures optimisées visent à maximiser le débit des données écrites dans un service de stockage. Cela peut être accompli en réduisant le nombre de fichiers écrits, sans sacrifier trop de parallélisme.

Les écritures optimisées nécessitent la permutation des données en fonction de la structure de partitionnement de la table cible. Cela implique naturellement un coût supplémentaire. Toutefois, les gains de débit pendant l’écriture peuvent rembourser le coût de la lecture aléatoire. Si ce n’est pas le cas, les gains de débit lors de l’interrogation des données doivent tout de même rendre cette fonctionnalité intéressante.

Le principal élément des écritures optimisées est qu’il s’agit d’une lecture aléatoire adaptative. Si vous avez un cas d’utilisation de la diffusion en continu et que les taux de données d’entrée changent au fil du temps, la lecture adaptative s’ajuste en conséquence en fonction des débits de données entrantes sur les micro-lots. Si vous avez des extraits de code là où vous coalesce(n) ou repartition(n) juste avant d’écrire votre flux, vous pouvez supprimer ces lignes.

Quand s’abonner

  • Les cas d’utilisation en continu où les minutes de latence sont acceptables
  • quand vous utilisez des commandes SQL comme MERGE , UPDATE ,, DELETEINSERT INTO ,CREATE TABLE AS SELECT

Quand refuser

Lorsque les données écrites sont dans l’ordre des téraoctets et que les instances optimisées pour le stockage ne sont pas disponibles.

Quand s’abonner à la compression automatique

Le compactage automatique se produit après la réussite d’une écriture dans une table et s’exécute de façon synchrone sur le cluster qui a effectué l’écriture. Cela signifie que si vous avez des modèles de code où vous effectuez une écriture dans Delta Lake, puis appelez immédiatement OPTIMIZE , vous pouvez supprimer l' OPTIMIZE appel si vous activez la compression automatique.

La compression automatique utilise des heuristiques différentes de celles de OPTIMIZE . Étant donné qu’elle s’exécute de façon synchrone après une écriture, nous avons réglé la compression automatique pour s’exécuter avec les propriétés suivantes :

  • Azure Databricks ne prend pas en charge l’ordre de plan avec compression automatique, car l’ordre de plan est beaucoup plus onéreux que le simple compactage.
  • Le compactage automatique génère des fichiers plus petits (128 Mo) de OPTIMIZE (1 Go).
  • Le compactage automatique greedily choisit un ensemble limité de partitions qui tireront le meilleur parti du compactage. Le nombre de partitions sélectionnées varie en fonction de la taille du cluster sur lequel elle est lancée. Si votre cluster possède plus de processeurs, davantage de partitions peuvent être optimisées.
  • Pour contrôler la taille du fichier de sortie, définissez la configuration Spark . La valeur par défaut est 134217728 , qui définit la taille sur 128 Mo. La spécification de la valeur 104857600 définit la taille du fichier sur 100 Mo.

Quand s’abonner

  • Les cas d’utilisation en continu où les minutes de latence sont acceptables
  • Lorsque vous n’avez pas OPTIMIZE d’appels réguliers sur votre table

Quand refuser

Lorsque d’autres enregistreurs effectuent des opérations telles que DELETE , MERGE , UPDATE ou OPTIMIZE simultanément, le compactage automatique peut entraîner un conflit de transactions pour ces travaux. Si le compactage automatique échoue en raison d’un conflit de transactions, Azure Databricks n’échoue pas ou n’effectue pas de nouvelle tentative de compactage.

Exemple de workflow : Ingestion de streaming avec suppressions ou mises à jour simultanées

Ce flux de travail part du principe que vous disposez d’un cluster exécutant une tâche de diffusion en continu 24/7 qui ingère des données, et d’un cluster qui s’exécute toutes les heures, tous les jours ou à la base ad hoc pour supprimer ou mettre à jour un lot d’enregistrements. Pour ce cas d’utilisation, Azure Databricks vous recommande de :

  • Activer les écritures optimisées au niveau de la table à l’aide de

    ALTER TABLE <table_name|delta.`table_path`> SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
    

    Cela garantit que le nombre de fichiers écrits par le flux et les travaux de suppression et de mise à jour sont de taille optimale.

  • Activez la compression automatique au niveau de la session à l’aide du paramètre suivant sur le travail qui exécute la suppression ou la mise à jour.

    spark.sql("set spark.databricks.delta.autoCompact.enabled = true")
    

    Cela permet de compacter des fichiers dans votre table. Dans la mesure où elle se produit après la suppression ou la mise à jour, vous limitez les risques liés à un conflit de transactions.

Forum Aux Questions (FAQ)

L’optimisation automatique des fichiers d’ordre de plan ?

L’optimisation automatique effectue un compactage uniquement sur les petits fichiers. Il n’effectue pas d' ordre de plan dans les fichiers.

L’optimisation automatique entraîne-t-elle la corruption des fichiers triés Z ?

L’optimisation automatique ignore les fichiers triés dans l’ordre décroissant. Il compacte uniquement les nouveaux fichiers.

Si l’option optimisation automatique est activée sur une table dans laquelle je diffuse la diffusion en continu et qu’une transaction simultanée est en conflit avec l’optimisation, mon travail échoue-t-il ?

Non. Les conflits de transactions qui provoquent l’échec de l’optimisation automatique sont ignorés, et le flux continue de fonctionner normalement.

Dois-je planifier OPTIMIZE des tâches si l’optimisation automatique est activée sur ma table ?

Pour les tables dont la taille est supérieure à 10 to, nous vous recommandons de continuer OPTIMIZE à utiliser une planification pour consolider les fichiers et de réduire les métadonnées de votre table Delta. Étant donné que l’optimisation automatique ne prend pas en charge l’ordre de plan, vous devez toujours planifier l' OPTIMIZE ... ZORDER BY exécution périodique des tâches.

Je dispose de nombreux petits fichiers. Pourquoi l’option optimisation automatique ne compresse-t-elle pas ?

Par défaut, l’optimisation automatique ne commence pas à compacter jusqu’à ce qu’elle trouve plus de 50 petits fichiers dans un répertoire. Vous pouvez modifier ce comportement en définissant spark.databricks.delta.autoCompact.minNumFiles . Un grand nombre de petits fichiers n’est pas toujours un problème, car cela peut entraîner l’ignorance de meilleures données et permet de réduire les réécritures lors des fusions et des suppressions. Toutefois, le fait de disposer d’un trop grand nombre de petits fichiers peut être un signe que vos données sont sur-partitionnées.