Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Parallelität auf Zeilenebene reduziert Konflikte zwischen gleichzeitigen Schreibvorgängen, indem Änderungen auf Zeilenebene erkannt und Konflikte automatisch aufgelöst werden, die auftreten, wenn gleichzeitige Schreibvorgänge in derselben Datendatei aktualisiert oder gelöscht werden.
Anforderungen für Zeilenebenkonkurrenz
Tabellen unterstützen keine Parallelität auf Zeilenebene, wenn sie Partitionen definiert haben oder keine Löschvektoren aktiviert sind. Parallelität auf Zeilenebene erfordert Databricks Runtime 14.2 und höher.
Tabellen mit Partitionen unterstützen keine Parallelität auf Zeilenebene, können aber weiterhin Konflikte zwischen OPTIMIZE und allen anderen Schreibvorgängen vermeiden, wenn Vektoren für Löschungen aktiviert sind. Siehe Einschränkungen für Parallelität auf Zeilenebene.
Informationen zu Databricks-Runtime-Versionen vor 14.2 finden Sie unter Konkurrenzverhalten auf Zeilenebene (Legacy).
Hinweis
Um die Unterstützung von MERGE INTO für Parallelität auf Zeilenebene zu ermöglichen, ist Photon in Databricks Runtime 14.2 erforderlich. In Databricks Runtime 14.3 LTS und höher ist Photon nicht erforderlich.
Konfliktmatrix mit Zeilenebenengleichzeitigkeit
Die folgende Tabelle zeigt, welche Schreibvorgängepaare in jeder Isolationsebene mit aktivierter Parallelität auf Zeilenebene in Konflikt stehen können:
| INSERT (1) | UPDATELÖSCHEN MERGE INTO | OPTIMIZE | |
|---|---|---|---|
| INSERT | Kann nicht in Konflikt geraten | ||
| UPDATELÖSCHEN MERGE INTO | In WriteSerializable ist kein Konflikt möglich. Kann in einem serialisierbaren Kontext beim Ändern derselben Zeile einen Konflikt verursachen. | Kann beim Ändern derselben Zeile Konflikte verursachen. | |
| OPTIMIZE | Kann nicht in Konflikt geraten | Kann einen Konflikt verursachen, wenn ZORDER BY verwendet wird. Andernfalls kann es keinen Konflikt geben. |
Kann einen Konflikt verursachen, wenn ZORDER BY verwendet wird. Andernfalls kann es keinen Konflikt geben. |
(1) Alle INSERT Vorgänge in dieser Tabelle beschreiben Anfügeoperationen, die keine Daten aus derselben Tabelle vor dem Abschließen lesen.
INSERT-Vorgänge, die Unterabfragen enthalten, die dieselbe Tabelle lesen, unterstützen die gleiche Parallelität wie MERGE.
Hinweis
- Tabellen mit Identitätsspalten unterstützen keine gleichzeitigen Transaktionen. Weitere Informationen finden Sie unter Verwenden von Identitätsspalten in Delta Lake.
-
REORGVorgänge verfügen über isolationssemantische Semantik, dieOPTIMIZEbeim Umschreiben von Datendateien identisch ist. Wenn Sie mitREORGein Upgrade anwenden, ändern sich die Tabellenprotokolle, was für Konflikte mit allen laufenden Vorgängen sorgt.
Schreibkonflikte ohne Konkurrenz auf Zeilenebene
Tabellen unterstützen keine Parallelität auf Zeilenebene, wenn für sie Partitionen definiert oder keine Löschvektoren aktiviert sind. Databricks Runtime 14.2 oder höher ist für die Parallelität auf Zeilenebene erforderlich.
Konfliktmatrix ohne Reihenebenenkonkurrenz
Die folgende Tabelle zeigt, welche Schreibvorgängepaare in den einzelnen Isolationsstufen in Konflikt stehen können:
| INSERT (1) | UPDATELÖSCHEN MERGE INTO | OPTIMIZE | |
|---|---|---|---|
| INSERT | Kann nicht in Konflikt geraten | ||
| UPDATELÖSCHEN MERGE INTO | In WriteSerializable ist kein Konflikt möglich. Kann in Serialisierbar (serializable) einen Konflikt verursachen. Siehe Vermeiden von Konflikten mithilfe der Partitionierung. | Kann zu Konflikten in „Serializable“ und „WriteSerializable“ führen. Siehe Vermeiden von Konflikten mithilfe der Partitionierung. | |
| OPTIMIZE | Kann nicht in Konflikt geraten | In Tabellen mit aktivierten Löschvektoren kann kein Konflikt auftreten, es sei denn, ZORDER BY wird verwendet. Andernfalls kann ein Konflikt auftreten. |
In Tabellen mit aktivierten Löschvektoren kann kein Konflikt auftreten, es sei denn ZORDER BY verwendet wird. Andernfalls kann ein Konflikt auftreten. |
(1) Alle INSERT Vorgänge in dieser Tabelle beschreiben Anfügevorgänge, die keine Daten aus derselben Tabelle vor dem Commit lesen.
INSERT-Vorgänge, die Unterabfragen enthalten, die dieselbe Tabelle lesen, unterstützen die gleiche Parallelität wie MERGE.
Hinweis
- Tabellen mit Identitätsspalten unterstützen keine gleichzeitigen Transaktionen. Weitere Informationen finden Sie unter Verwenden von Identitätsspalten in Delta Lake.
-
REORGVorgänge verfügen über eine Isolationssemantik, dieOPTIMIZEbeim Umschreiben von Datendateien identisch ist. Wenn Sie mitREORGein Upgrade anwenden, ändern sich die Tabellenprotokolle, was für Konflikte mit allen laufenden Vorgängen sorgt.
Einschränkungen für Konkurrenz auf Zeilenebene
Einschränkungen gelten für Zeilenebene-Konkurrenz. Für die folgenden Vorgänge folgt die Konfliktauflösung der normalen Parallelität für Schreibkonflikte. Siehe Schreibkonflikte ohne Gleichzeitigkeit auf Zeilenebene.
| Einschränkung | Beschreibung |
|---|---|
| Komplexe bedingte Klauseln | Bedingungen für komplexe Datentypen (Strukturen, Arrays, Karten), nicht deterministische Ausdrücke, Unterabfragen und korrelierte Unterabfragen |
MERGE Prädikatanforderung |
In Databricks Runtime 14.2 müssen Befehle ein explizites Prädikat für die Zieltabelle verwenden, um Zeilen zu filtern, MERGE die der Quelltabelle entsprechen. |
| Leistungskonflikt | Die Konflikterkennung auf Zeilenebene kann die Gesamtausführungszeit erhöhen. Bei vielen gleichzeitigen Transaktionen priorisiert der Writer die Latenz gegenüber der Konfliktauflösung. |
Alle Einschränkungen für Löschvektoren gelten ebenfalls. Informationen finden Sie unter Einschränkungen.
Vermeiden von Konflikten mithilfe der Partitionierung
Für alle Fälle, die in den Konfliktmatrizen als "Kann konflikt" gekennzeichnet sind, tritt ein Konflikt nur auf, wenn sich die beiden Vorgänge auf dieselbe Gruppe von Dateien auswirken. Um zwei Gruppen von Dateien getrennt zu machen, partitionieren Sie die Tabelle nach den gleichen Spalten, die in Vorgangsbedingungen verwendet werden.
Example:
Die Befehle UPDATE table WHERE date > '2010-01-01' ... und DELETE table WHERE date < '2010-01-01' konfliktieren, wenn die Tabelle nicht nach Datum partitioniert ist, da beide denselben Dateien gleichzeitig zu ändern versuchen können. Durch Partitionierung der Tabelle mittels date wird der Konflikt vermieden.
Hinweis
Die Partitionierung einer Tabelle nach einer Spalte mit hoher Kardinalität kann zu Leistungsproblemen aufgrund der großen Anzahl von Unterverzeichnissen führen.
Beispiel: Vermeiden von Konflikten mit expliziten Partitionsfiltern
Diese Ausnahme wird häufig während gleichzeitiger DELETE, UPDATE oder MERGE-Vorgänge ausgelöst, die möglicherweise dieselbe Partition lesen, selbst wenn verschiedene Partitionen aktualisiert werden. Die Trennung in der Vorgangsbedingung explizit festlegen:
// Problem: Condition can scan the entire table
deltaTable.as("t").merge(
source.as("s"),
"s.user_id = t.user_id AND s.date = t.date AND s.country = t.country")
.whenMatched().updateAll()
.whenNotMatched().insertAll()
.execute()
// Solution: Add explicit partition filters
deltaTable.as("t").merge(
source.as("s"),
"s.user_id = t.user_id AND s.date = t.date AND s.country = t.country AND t.date = '" + date + "' AND t.country = '" + country + "'")
.whenMatched().updateAll()
.whenNotMatched().insertAll()
.execute()
Konfliktsausnahmen
Wenn ein Transaktionskonflikt auftritt, beobachten Sie eine der folgenden Ausnahmen:
ConcurrentAppendException
Diese Ausnahme tritt auf, wenn ein gleichzeitiger Vorgang Dateien in derselben Partition (oder an einer beliebigen Stelle in einer nicht partitionierten Tabelle) hinzufügt, die ihr Vorgang liest. Dieses Hinzufügen von Dateien kann durch INSERT-, DELETE-, UPDATE- oder MERGE-Vorgänge verursacht werden.
Bei der standardmäßigen Isolationsstufe "WriteSerializable" werden durch blinde INSERT Vorgänge (Vorgänge, die Daten anfügen, ohne Daten zu lesen) keine Konflikte mit anderen Vorgängen verursacht. Wenn die Isolationsstufe serialisierbar ist, können blinde Anhänge konfliktieren.
Von Bedeutung
Blindanfügungen können im WriteSerializable-Modus in Konflikt geraten, wenn mehrere gleichzeitige DELETE, UPDATE oder MERGE Vorgänge auf Werte verweisen können, die durch Blindanfügungen eingefügt wurden. Um dies zu vermeiden:
- Sicherstellen, dass gleichzeitige
DELETE,UPDATEoderMERGEVorgänge die angefügten Daten nicht lesen - Verwenden Sie höchstens eine
DELETE,UPDATE, oderMERGEOperation, die die angefügten Daten lesen kann.
GleichzeitigesDeleteReadException
Diese Ausnahme tritt auf, wenn ein gleichzeitiger Vorgang eine Datei löscht, die der Vorgang liest. Häufige Ursachen sind DELETE, UPDATEoder MERGE Vorgänge, die Dateien umschreiben.
ConcurrentDeleteDeleteException
Diese Ausnahme tritt auf, wenn ein gleichzeitiger Vorgang eine Datei löscht, die Ihre Operation ebenfalls löscht. Dies kann durch zwei gleichzeitige Komprimierungsvorgänge verursacht werden, die dieselben Dateien umschreiben.
MetadataChangedException
Diese Ausnahme tritt auf, wenn eine gleichzeitige Transaktion die Metadaten einer Delta-Tabelle aktualisiert. Häufige Ursachen sind ALTER TABLE Vorgänge oder Schreibvorgänge, die das Tabellenschema aktualisieren.
GleichzeitigeTransaktionsAusnahme
Diese Ausnahme tritt auf, wenn eine Streamingabfrage, die denselben Prüfpunktspeicherort verwendet, mehrmals gleichzeitig gestartet wird und versucht, gleichzeitig in die Delta-Tabelle zu schreiben. Führen Sie niemals zwei Streamingabfragen mit demselben Prüfpunktspeicherort gleichzeitig aus.
ProtocolChangedException
Diese Ausnahme kann auftreten, wenn:
- Ihre Delta-Tabelle wird auf eine neue Protokollversion aktualisiert (Möglicherweise müssen Sie Ihre Databricks-Runtime aktualisieren)
- Mehrere Autoren erstellen oder ersetzen gleichzeitig eine Tabelle
- Mehrere Autoren schreiben gleichzeitig in einen leeren Pfad
Siehe Delta Lake Featurekompatibilität und Protokolle.
Vorschauverhalten für Parallelität auf Zeilenebene (Ältere Version)
In diesem Abschnitt werden Vorschauverhalten für Zeilenkonkurrenz in Databricks Runtime 14.1 und älter beschrieben.
| Databricks-Runtimeversion | Verhalten |
|---|---|
| Databricks Runtime 13.3 LTS und höher | Tabellen mit flüssiger Clusterung ermöglichen automatisch parallele Zeilenebene |
| Databricks Runtime 14.0 und 14.1 | Aktivieren der Parallelität auf Zeilenebene für Tabellen mit Löschvektoren mithilfe der folgenden Konfiguration |
| Databricks Runtime 14.1 und darunter | Nicht-Photon-Computing unterstützt nur die Zeilenebenen-Parallelität für DELETE-Vorgänge. |
So aktivieren Sie die Parallelität auf Zeilenebene in Databricks Runtime 14.0 und 14.1:
spark.databricks.delta.rowLevelConcurrencyPreview = true
Parallelität auf Zeilenebene erfordert immer Löschvektoren.