Lorsque plusieurs jobs écrivent simultanément dans la même table Delta, vous devez comprendre quelles combinaisons d'opérations entrent en conflit, comment MaxCompute les résout et comment concevoir vos pipelines pour les éviter. MaxCompute s'appuie sur MetaService pour gérer toutes les opérations de modification des données sur les tables Delta sous forme de transactions. Le contrôle de concurrence multiversion (MVCC) isole les lectures et écritures concurrentes sur les snapshots, tandis que le contrôle de concurrence optimiste (OCC) gère la concurrence des transactions.
Règles de détection des conflits
Le tableau suivant présente la manière dont MaxCompute résout les conflits entre des jobs concurrents portant sur la même table non partitionnée ou la même partition. Le job qui se termine en premier est considéré comme le job antérieur ; celui qui se termine plus tard est le job postérieur.
|
Job antérieur |
Job postérieur |
Résultat |
|
INSERT OVERWRITE / TRUNCATE |
INSERT OVERWRITE / TRUNCATE |
Les deux réussissent. Le résultat du job postérieur écrase celui du job antérieur. |
|
INSERT OVERWRITE / TRUNCATE |
INSERT INTO |
Le job antérieur réussit. Le job postérieur échoue. |
|
INSERT OVERWRITE / TRUNCATE |
UPDATE / DELETE |
Le job antérieur réussit. Le job postérieur échoue. |
|
INSERT OVERWRITE / TRUNCATE |
MINOR COMPACT |
Le job antérieur réussit. Le job postérieur échoue. |
|
INSERT OVERWRITE / TRUNCATE |
MAJOR COMPACT |
Le job antérieur réussit. Le job postérieur échoue. |
|
INSERT INTO |
INSERT OVERWRITE / TRUNCATE |
Les deux réussissent. Le résultat du job postérieur écrase celui du job antérieur. |
|
INSERT INTO |
INSERT INTO |
Le job antérieur réussit. Le job postérieur échoue. |
|
INSERT INTO |
UPDATE / DELETE |
Le job antérieur réussit. Le job postérieur échoue. |
|
INSERT INTO |
MINOR COMPACT |
Les deux réussissent. La compaction du job postérieur aboutit. |
|
INSERT INTO |
MAJOR COMPACT |
Le job antérieur réussit. Le job postérieur échoue. |
|
UPDATE / DELETE |
INSERT OVERWRITE / TRUNCATE |
Les deux réussissent. Le résultat du job postérieur écrase celui du job antérieur. |
|
UPDATE / DELETE |
INSERT INTO |
Le job antérieur réussit. Le job postérieur échoue. |
|
UPDATE / DELETE |
UPDATE / DELETE |
Le job antérieur réussit. Le job postérieur échoue. |
|
UPDATE / DELETE |
MINOR COMPACT |
Les deux réussissent. La compaction du job postérieur aboutit. |
|
UPDATE / DELETE |
MAJOR COMPACT |
Le job antérieur réussit. Le job postérieur échoue. |
|
MINOR COMPACT |
INSERT OVERWRITE / TRUNCATE |
Les deux réussissent. Le résultat du job postérieur écrase celui du job antérieur. |
|
MINOR COMPACT |
INSERT INTO |
Les deux réussissent. Les nouvelles données du job postérieur sont écrites. |
|
MINOR COMPACT |
UPDATE / DELETE |
Les deux réussissent. Les nouvelles données du job postérieur sont écrites. |
|
MINOR COMPACT |
MINOR COMPACT |
Le job antérieur réussit. Le job postérieur échoue. |
|
MINOR COMPACT |
MAJOR COMPACT |
Les deux réussissent. La compaction du job postérieur aboutit. |
|
MAJOR COMPACT |
INSERT OVERWRITE / TRUNCATE |
Les deux réussissent. Le résultat du job postérieur écrase celui du job antérieur. |
|
MAJOR COMPACT |
INSERT INTO |
Les deux réussissent. Les nouvelles données du job postérieur sont écrites. |
|
MAJOR COMPACT |
UPDATE / DELETE |
Les deux réussissent. Les nouvelles données du job postérieur sont écrites. |
|
MAJOR COMPACT |
MINOR COMPACT |
Le job antérieur réussit. Le job postérieur échoue. |
|
MAJOR COMPACT |
MAJOR COMPACT |
Le job antérieur réussit. Le job postérieur échoue. |
Ces règles s'appliquent au niveau de la transaction, et non au niveau de la ligne ou du fichier.
Optimisation des conflits de concurrence
MaxCompute optimise la gestion des conflits pour les combinaisons d'opérations courantes, réduisant ainsi les échecs inutiles tout en préservant l'exactitude des données.
L'optimisation des conflits de concurrence s'applique uniquement à la gestion des transactions sur une seule table.
Résolution intelligente des conflits
Toutes les transactions qui se chevauchent n'entrent pas nécessairement en conflit. Par exemple, lorsqu'une opération de clustering et une opération INSERT INTO se chevauchent en termes de démarrage et de validation, les deux aboutissent. Le clustering réorganise la disposition physique des données sans modifier leur état ; il ne peut donc pas provoquer d'incohérence d'état avec une écriture concurrente. MaxCompute détecte cette situation et autorise la poursuite des deux opérations. La logique de gestion des conflits de transactions continuera d'être optimisée pour s'adapter à davantage de scénarios.
Nouvelle tentative au niveau des métadonnées
En cas d'échec de la détection des conflits, MaxCompute effectue une nouvelle tentative au niveau des métadonnées. Aucune donnée n'a besoin d'être relue ou réécrite. Cette approche réduit la consommation de ressources par rapport à la réexécution complète du job.
Mises à jour atomiques des métadonnées
Les métadonnées sont mises à jour de manière atomique afin de garantir la cohérence des données.
Gestion des versions des fichiers de données
Chaque transaction génère un lot de nouveaux fichiers de données associés à deux types de versions :
|
Type de version |
Type de données |
Généré lorsque |
Utilisé pour |
|
Version temporelle |
TIMESTAMP |
Opérations déclenchées par l'utilisateur qui modifient uniquement les données sur le plan logique. Le clustering et la compaction ne génèrent pas de nouvelle version temporelle. |
Requêtes incrémentielles basées sur le temps. Les fichiers issus du clustering et de la compaction sont exclus. |
|
Version ID |
Entier à incrémentation automatique |
Chaque opération sur les données au sein d'une transaction, y compris le clustering et la compaction. |
Gestion interne des transactions (principale). Également disponible pour les requêtes incrémentielles. |