Udostępnij za pośrednictwem


Współbieżność na poziomie wiersza

Współbieżność na poziomie wiersza zmniejsza konflikty między współbieżnych operacji zapisu, wykrywając zmiany na poziomie wiersza i automatycznie rozwiązując konflikty występujące podczas współbieżnej aktualizacji zapisu lub usuwania różnych wierszy w tym samym pliku danych.

Wymagania dotyczące współbieżności na poziomie wiersza

Tabele nie obsługują współbieżności na poziomie wiersza, jeśli mają zdefiniowane partycje lub nie mają włączonych wektorów usuwania. Współbieżność na poziomie wiersza wymaga środowiska Databricks Runtime 14.2 lub nowszego.

Tabele z partycjami nie obsługują współbieżności na poziomie wiersza, ale nadal mogą unikać konfliktów między OPTIMIZE a wszystkimi innymi operacjami zapisu, gdy wektory usuwania są włączone. Zobacz Ograniczenia dotyczące współbieżności na poziomie wiersza.

W przypadku wersji środowiska Databricks Runtime przed 14.2 zobacz Zachowanie podglądu współbieżności na poziomie wiersza (starsza wersja).

Uwaga / Notatka

MERGE INTO Obsługa współbieżności na poziomie wiersza wymaga aplikacji Photon w środowisku Databricks Runtime 14.2. W środowisku Databricks Runtime 14.3 LTS i nowszym aplikacja Photon nie jest wymagana.

Macierz konfliktów ze współbieżnością na poziomie wiersza

W poniższej tabeli przedstawiono, które pary operacji zapisu mogą powodować konflikty na każdym poziomie izolacji z włączoną współbieżnością na poziomie wiersza:

INSERT (1) UPDATE, USUŃ, MERGE INTO OPTIMIZE
INSERT Nie może być konfliktu
UPDATE, USUŃ, MERGE INTO Nie może wystąpić konflikt w WriteSerializable. Może powodować konflikt w przypadku serializacji podczas modyfikowania tego samego wiersza. Może powodować konflikt podczas modyfikowania tego samego wiersza.
OPTIMIZE Nie może być konfliktu Może powodować konflikt, gdy ZORDER BY jest używany. Inaczej nie może dojść do konfliktu. Może powodować konflikt, gdy ZORDER BY jest używany. Inaczej nie może dojść do konfliktu.

(1) Wszystkie INSERT operacje w tej tabeli opisują operacje dodawania, które nie odczytują żadnych danych z tej samej tabeli przed zatwierdzeniem. INSERT operacje zawierające podzapytania odczytujące tę samą tabelę obsługują tę samą współbieżność co MERGE.

Uwaga / Notatka

  • Tabele z kolumnami tożsamości nie obsługują transakcji współbieżnych. Zobacz Korzystanie z kolumn tożsamości w Delta Lake.
  • REORG operacje mają semantyki izolacji identyczną jak OPTIMIZE podczas ponownego zapisywania plików danych. W przypadku zastosowania REORG uaktualnienia, protokoły tabel zmieniają się, co stwarza konflikt ze wszystkimi trwającymi operacjami.

Konflikty zapisu bez współbieżności na poziomie poszczególnych wierszy

Tabele nie obsługują współbieżności na poziomie wiersza, jeśli mają zdefiniowane partycje lub nie mają włączonych wektorów usuwania. Środowisko Databricks Runtime 14.2 lub nowsze jest wymagane do współbieżności na poziomie wiersza.

Macierz konfliktów bez współbieżności na poziomie wiersza

W poniższej tabeli przedstawiono, które pary operacji zapisu mogą powodować konflikty na każdym poziomie izolacji:

INSERT (1) UPDATE, USUŃ, MERGE INTO OPTIMIZE
INSERT Nie może być konfliktu
UPDATE, USUŃ, MERGE INTO Nie może wystąpić konflikt w WriteSerializable. Może powodować konflikt w ramach Serializable. Zobacz Unikanie konfliktów przy użyciu partycjonowania. Może wystąpić konflikt pomiędzy Serializable a WriteSerializable. Zobacz Unikanie konfliktów przy użyciu partycjonowania.
OPTIMIZE Nie może być konfliktu Nie ma możliwości konfliktu w tabelach z włączonymi wektorami usuwania, chyba że używany jest ZORDER BY. W przeciwnym razie może powodować konflikt. Nie może dojść do konfliktu w tabelach, które mają włączone wektory usuwania, chyba że ZORDER BY jest używany. W przeciwnym razie może powodować konflikt.

(1) Wszystkie INSERT operacje w tej tabeli dotyczą operacji dołączania, które nie odczytują danych z tej samej tabeli przed zatwierdzeniem. INSERT operacje zawierające podzapytania odczytujące tę samą tabelę obsługują tę samą współbieżność co MERGE.

Uwaga / Notatka

  • Tabele z kolumnami tożsamości nie obsługują transakcji współbieżnych. Zobacz Korzystanie z kolumn tożsamości w Delta Lake.
  • REORG operacje mają semantykę izolacji identyczną jak OPTIMIZE podczas przepisywania plików danych. W przypadku zastosowania REORG uaktualnienia, protokoły tabel zmieniają się, co stwarza konflikt ze wszystkimi trwającymi operacjami.

Ograniczenia współbieżności na poziomie wiersza

Ograniczenia dotyczą współbieżności na poziomie wiersza. W przypadku następujących operacji rozwiązywanie konfliktów odbywa się zgodnie z normalnym trybem współbieżnego przetwarzania podczas konfliktów zapisu. Zobacz Konflikty zapisu przy braku współbieżności na poziomie wierszy.

Limitation Opis
Złożone klauzule warunkowe Warunki dotyczące złożonych typów danych (struktur, tablic, map), wyrażeń niedeterministycznych, podzapytania i skorelowanych podzapytania
MERGE wymaganie predykatu W środowisku Databricks Runtime 14.2 MERGE polecenia muszą używać jawnego predykatu w tabeli docelowej, aby filtrować wiersze, które odpowiadają tabeli źródłowej.
Kompromis w zakresie wydajności Wykrywanie konfliktów na poziomie wiersza może zwiększyć całkowity czas wykonywania. W przypadku wielu równoczesnych transakcji piszący priorytetuje niskie opóźnienia kosztem rozwiązywania konfliktów.

Obowiązują również wszystkie ograniczenia dotyczące wektorów usuwania. Zobacz Ograniczenia.

Unikanie konfliktów przy użyciu partycjonowania

We wszystkich przypadkach oznakowanych jako "może powodować konflikt" w macierzach konfliktów, konflikt występuje tylko wtedy, gdy obie operacje mają wpływ na ten sam zestaw plików. Aby rozdzielić dwa zestawy plików, podziel tabelę na partycje według tych samych kolumn używanych w warunkach operacyjnych.

Example:

Polecenia UPDATE table WHERE date > '2010-01-01' ... i DELETE table WHERE date < '2010-01-01' będą w konflikcie, jeśli tabela nie jest partycjonowana według daty, ponieważ oba mogą próbować zmodyfikować te same pliki. Partycjonowanie tabeli z użyciem date unika konfliktu.

Uwaga / Notatka

Partycjonowanie tabeli według kolumny o wysokiej kardynalności może prowadzić do problemów z wydajnością ze względu na dużą liczbę podkatalogów.

Przykład: Unikanie konfliktów z jawnymi filtrami partycji

Ten wyjątek jest często zgłaszany podczas współbieżnych operacji DELETE, UPDATE lub MERGE, które mogą odczytywać tę samą partycję, nawet gdy aktualizowane są różne partycje. Ustaw separację jawną w warunku operacji:

// 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()

Wyjątki od konfliktów

W przypadku wystąpienia konfliktu transakcji obserwujesz jeden z następujących wyjątków:

ConcurrentAppendException

Wyjątek ten występuje, gdy współbieżna operacja dodaje pliki w tej samej partycji (lub w dowolnym miejscu w niepartycjonowanej tabeli), którą odczytuje operacja. Dodatki plików mogą być spowodowane operacjami INSERT, DELETE, UPDATElub MERGE .

W przypadku domyślnego poziomu izolacji WriteSerializable pliki dodawane przez operacje ślepe INSERT (operacje dołączające dane bez odczytywania danych) nie powodują konfliktu z żadną operacją. Jeśli poziom izolacji jest Serializable, ślepe dodania mogą powodować konflikt.

Ważna

Ślepe dołączenia mogą powodować konflikt w trybie WriteSerializable, jeśli wiele współbieżnych operacji DELETE, UPDATE lub MERGE może odnosić się do wartości wstawionych przez ślepe dołączenia. Aby tego uniknąć:

  • Upewnij się, że współbieżne operacje DELETE, UPDATE lub MERGE nie odczytują dołączonych danych
  • Miej co najwyżej jedną operację DELETE, UPDATE, lub MERGE, która może odczytywać dołączone dane.

ConcurrentDeleteReadException

Ten wyjątek występuje, gdy operacja współbieżna usuwa plik odczytany przez operację. Typowe przyczyny to DELETE, UPDATElub MERGE operacje, które ponownie zapisują pliki.

ConcurrentDeleteDeleteException

Ten wyjątek występuje, gdy operacja współbieżna usuwa również plik, który operacja usuwa. Może to być spowodowane przez dwie współbieżne operacje kompaktowania przepisujące te same pliki.

MetadataChangedException

Ten wyjątek występuje, gdy współbieżna transakcja aktualizuje metadane tabeli delty. Typowe przyczyny to ALTER TABLE operacje lub zapisy, które aktualizują schemat tabeli.

ConcurrentTransactionException

Ten wyjątek występuje, jeśli zapytanie przesyłane strumieniowo przy użyciu tej samej lokalizacji punktu kontrolnego jest uruchamiane wiele razy jednocześnie i próbuje zapisać w tabeli delty w tym samym czasie. Nigdy nie uruchamiaj dwóch zapytań przesyłanych strumieniowo z tą samą lokalizacją punktu kontrolnego jednocześnie.

ProtocolChangedException (WyjątekZmianyProtokołu)

Ten wyjątek może wystąpić, gdy:

  • Tabela delta została uaktualniona do nowej wersji protokołu (może być konieczne uaktualnienie środowiska Databricks Runtime)
  • Wiele autorów tworzy lub zastępuje tabelę w tym samym czasie
  • Wielu autorów zapisuje w pustej ścieżce w tym samym czasie

Zobacz kompatybilność funkcji i protokoły Delta Lake.

Zachowanie podglądu współbieżności na poziomie wiersza (starsza wersja)

W tej sekcji opisano zachowania podglądu współbieżności na poziomie wiersza w środowisku Databricks Runtime 14.1 lub nowszym.

Wersja usługi Databricks Runtime Zachowanie
Databricks Runtime 13.3 LTS i nowsze Tabele z płynnym klastrowaniem automatycznie włączają współbieżność na poziomie wiersza
Databricks Runtime 14.0 i 14.1 Włącz współbieżność na poziomie wiersza dla tabel z wektorami usuwania przy użyciu poniższej konfiguracji
Środowisko Databricks Runtime 14.1 i starsze Obliczenia inne niż Photon obsługują tylko współbieżność na poziomie wiersza dla DELETE operacji

Aby włączyć współbieżność na poziomie wiersza w środowisku Databricks Runtime 14.0 i 14.1:

spark.databricks.delta.rowLevelConcurrencyPreview = true

Współbieżność na poziomie wiersza zawsze wymaga wektorów usuwania.

Następne kroki