Kompaktowanie tabel Delta

Pliki tabel Delta stają się fragmentowane w czasie. Fragmentacja zwiększa obciążenie związane z operacją plików, zmniejsza wydajność kompresji i może ograniczyć równoległość czytnika. Kompaktowanie ponownie zapisuje wiele małych plików w mniejszej liczbie plików o odpowiednich rozmiarach, dzięki czemu platforma Spark może wydajniej odczytywać i przetwarzać dane.

Polecenie OPTIMIZE jest podstawową operacją kompaktowania. Grupuje małe pliki w pojemniki dostosowane do idealnego rozmiaru pliku, a następnie zapisuje je ponownie na nośniku.

Aby uzyskać wskazówki dotyczące zwartości między obciążeniami dotyczące strategii kompaktowania w punktach końcowych usługi SQL Analytics, usłudze Power BI Direct Lake i platformie Spark, zobacz Obsługa i optymalizacja tabeli między obciążeniami.

Metody kompaktowania

Microsoft Fabric oferuje kilka metod utrzymania optymalnych rozmiarów plików w tabelach delty:

OPTIMIZE polecenie

Polecenie OPTIMIZE to fundamentalna operacja kompaktująca tabelę Delta. Ponownie zapisuje małe pliki w większych plikach, aby poprawić układ danych w tabelach delty.

OPTIMIZE dbo.table_name
Majątek Description Wartość domyślna Konfiguracja sesji
minFileSize Pliki, które są mniejsze niż ten próg, są grupowane razem i ponownie pisane jako większe pliki. 1073741824 (1 GB) spark.databricks.delta.optimize.minFileSize
maxFileSize Rozmiar pliku docelowego wygenerowany przez OPTIMIZE polecenie . 1073741824 (1 GB) spark.databricks.delta.optimize.maxFileSize

OPTIMIZE jest idempotentny, ale zbyt duży minFileSize może zwiększyć amplifikację zapisu. Na przykład przy ustawieniu minFileSize na 1 GB plik 900 MB może zostać nadpisany po niewielkiej dodatkowej operacji zapisu. Aby uzyskać wskazówki dotyczące automatycznego zarządzania rozmiarem plików, zobacz adaptacyjny rozmiar pliku docelowego.

OPTIMIZE z kolejnością Z

W przypadku użycia klauzuli ZORDER BY, OPTIMIZE ponownie zapisuje aktywne pliki, aby wiersze z podobnymi wartościami były umieszczone w tych samych plikach. Współlokalizowany układ usprawnia pomijanie plików w przypadku filtrów selektywnych. Użyj opcji Z-Order, gdy:

  • Zapytania często filtrują co najmniej dwie kolumny (na przykład daty i customer_id) i
  • Te predykaty są wystarczająco selektywne, że pomijanie na poziomie plików zmniejsza liczbę skanowanych plików.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)

OPTIMIZE z V-Order

Klauzula VORDER powoduje, że pliki objęte zakresem dla kompaktowania mają zastosowaną optymalizację V-Order. Aby uzyskać więcej informacji na temat V-Order, zobacz szczegółową dokumentację.

OPTIMIZE dbo.table_name VORDER

Możesz połączyć Z-Order i V-Order jednym poleceniem. Platforma Spark stosuje operacje w tej kolejności: kompaktowanie bin → Z-Order → V-Order.

OPTIMIZE dbo.table_name ZORDER BY (column1, column2) VORDER

Zachowanie V-Order podczas OPTIMIZE zależy od sposobu wywołania polecenia:

Wywołanie Behavior
OPTIMIZE table VORDER Wymusza porządek V w przepisanych plikach, niezależnie od ustawień sesji lub tabeli.
OPTIMIZE table (bez VORDER słowa kluczowego) Dziedziczy zachowanie V-Order z TBLPROPERTIES("delta.parquet.vorder.enabled"), jeśli jest ustawione; w przeciwnym razie używa konfiguracji sesji spark.sql.parquet.vorder.default.

OPTIMIZE z klastrowaniem płynnym

Klastrowanie Liquid jest określane jako opcja tabeli; Więcej informacji znajdziesz w włączaniu klastrowania Liquid. Po włączeniu klastrowania, OPTIMIZE wykonuje fizyczne ponowne zapisywanie, które stosuje politykę klastrowania.

Ważne

Dane są klastrowane tylko wtedy, gdy OPTIMIZE jest uruchamiane w tabelach z włączoną obsługą klastra liquid. Regularne operacje zapisu NIE klasterują danych. Posiadanie strategii kompaktowania, takiej jak używanie automatycznego kompaktowania lub ręczne planowanie zadań optymalizacji, ma kluczowe znaczenie dla zapewnienia, że można zrealizować zalety klastrowanych danych (czyli ulepszone pomijanie plików Delta).

Szybka optymalizacja

Szybka optymalizacja inteligentnie analizuje pliki tabeli delty i pomija operacje kompaktowania, które prawdopodobnie nie poprawią wydajności.

Zamiast niewidomie kompaktować pliki zawsze, gdy istnieją małe pliki, szybka optymalizacja ocenia, czy każdy pojemnik kandydata (grupa małych plików) spełnia konfigurowalne cele kompaktowania najlepszych rozwiązań. Szybka Optymalizacja uruchamia kompaktowanie tylko dla grupy plików, jeśli scalanie ich prawdopodobnie osiągnie minimalny zakładany rozmiar lub jeśli jest zbyt wiele małych plików. W przeciwnym razie pomija tę grupę lub zmniejsza liczbę plików, które kompaktuje.

SET spark.microsoft.delta.optimize.fast.enabled = TRUE

Szybka optymalizacja może być dostrojona w oparciu o oczekiwania dotyczące kompaktowania:

Majątek Description Wartość domyślna Konfiguracja sesji
minNumFiles Liczba małych plików, które muszą być obecne w pojemniku, aby możliwe było przeprowadzenie optymalizacji, jeśli pojemnik nie zawiera wystarczającej ilości danych do oszacowanego utworzenia skompaktowanego pliku. 50 spark.microsoft.delta.optimize.fast.minNumFiles
parquetCoefficient Pomnożony przez minimalny rozmiar pliku zdefiniowany w kontekście optymalizacji w celu określenia minimalnej ilości danych małych plików, które muszą istnieć w koszu, aby kosz został uwzględniony w zakresie kompaktowania. 1.3 spark.microsoft.delta.optimize.fast.parquetCoefficient

Uwaga / Notatka

parquetCoefficient powoduje, że docelowy rozmiar pojemnika jest większy niż minimalny rozmiar docelowy pliku w kontekście optymalizacji. Ten współczynnik uwzględnia fakt, że połączenie wielu małych plików parquet skutkuje lepszą kompresją i w efekcie mniejszą ilością danych niż suma tych małych plików. Zwiększ wartość, aby być bardziej konserwatywną w tym, jak często szybka optymalizacja pomija pojemniki, lub zmniejsz wartość, aby umożliwić bardziej permissywne pomijanie pojemnika.

Jak to działa

Funkcja szybkiej optymalizacji wprowadza dodatkowe kontrole przed kompaktowaniem pojemników. W przypadku każdego pojemnika kandydata szybka optymalizacja ocenia:

  • Szacowana ilość danych pierwotnych w pojemniku (suma małych rozmiarów plików)
  • Czy łączenie małych plików jest szacowane w celu utworzenia pliku spełniającego skonfigurowany minimalny rozmiar docelowy
  • Czy pojemnik zawiera co najmniej skonfigurowaną minimalną liczbę małych plików

Szybka optymalizacja ocenia każdy pojemnik małych plików i kompaktuje tylko pojemniki, które prawdopodobnie osiągną minimalny rozmiar docelowy lub przekraczają minimalną liczbę plików. Pojemniki, które nie spełniają tych progów, są pomijane lub częściowo kompresowane. Pomijanie nieoptymalnych pojemników zmniejsza niepotrzebne ponowne zapisywanie, obniża wzmacnianie zapisu i sprawia, że zadania OPTIMIZE są bardziej idempotentne.

Zrzut ekranu pokazujący, jak szybko optymalizacja ocenia, czy zasobnik jest skompaktowany.

Uwaga / Notatka

Dokładna implementacja może ewoluować wraz z upływem czasu.

Szybka optymalizacja może zmniejszyć liczbę przepisanych danych przez cały cykl życia tabeli Delta. Jak pokazano na poniższym diagramie, szybka optymalizacja pomija pojemniki nieoptymalne, co czyni zadania OPTIMIZE szybszymi i bardziej idempotentnymi z mniejszą amplifikacją zapisu.

Zrzut ekranu przedstawiający, jak szybka optymalizacja prowadzi do mniejszego ponownego zapisywania danych w miarę upływu czasu.

Uwaga / Notatka

Tylko w celach ilustracyjnych powyższe diagramy zakładają, że rozmiar pliku zapisanego z kompaktowania jest sumą rozmiaru małych plików. To również oznacza parquetCoefficient wartość 1.

Ograniczenia
  • Nie dotyczy klastrowania liquid i operacji Z-Order
  • Szybka optymalizacja nie modyfikuje zachowania autokompaktacji

Cele kompaktowania na poziomie plików

Aby uniknąć ponownego zapisywania danych, które zostały wcześniej uznane za kompaktowane (wystarczająco duże) na podstawie zmiany wartości minimalnych i maksymalnych docelowych rozmiaru pliku, spark.microsoft.delta.optimize.fileLevelTarget.enabled można włączyć, aby zapobiec ponownemu kompaktowaniu już skompaktowanych plików. Po włączeniu pliki nie są ponownie rekompaktowane, jeśli wcześniej spełniały co najmniej połowę rozmiaru pliku docelowego podczas kompaktowania. Utrzymywanie celów na poziomie pliku minimalizuje amplifikację zapisu, ponieważ rozmiar docelowy kompaktowania zmienia się wraz z upływem czasu (na przykład w wyniku oceny adaptacyjnego rozmiaru docelowego pliku i ustawienia większego celu). Jeśli ta opcja jest włączona, tag OPTIMIZE_TARGET_SIZE zostanie dodany do nowych plików podczas uruchamiania funkcji OPTIMIZE lub w przypadku każdej operacji zapisu, jeśli właściwość delta.targetFileSize lub delta.targetFileSize.adaptive tabeli jest ustawiona.

Uwaga / Notatka

Mimo że nie jest domyślnie włączona, firma Microsoft zaleca włączenie celów kompaktowania na poziomie plików w celu ograniczenia potencjalnego wzmacniania zapisu.

SET spark.microsoft.delta.optimize.fileLevelTarget.enabled = TRUE

Automatyczne kompaktowanie

Automatyczne kompaktowanie ocenia kondycję partycji po każdej operacji zapisu. Po wykryciu nadmiernej fragmentacji pliku (zbyt wielu małych plików) w partycji wyzwala ona operację synchroniczną OPTIMIZE natychmiast po zatwierdzeniu zapisu. To podejście sterowane przez autora do utrzymania plików jest optymalne, ponieważ kompaktowanie odbywa się tylko wtedy, gdy zostanie ocenione programowo jako korzystne.

Włącz na poziomie sesji

Ustaw spark.databricks.delta.autoCompact.enabled na poziomie sesji, aby włączyć automatyczne kompaktowanie dla nowych tabel utworzonych w tej sesji platformy Spark:

SET spark.databricks.delta.autoCompact.enabled = TRUE

Włącz na poziomie tabeli

Ustaw właściwość delta.autoOptimize.autoCompact tabeli, aby włączyć automatyczne kompaktowanie dla określonych tabel:

CREATE TABLE dbo.table_name
TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Użyj opcji delta.autoOptimize.autoCompact DataFrameWriter, aby włączyć automatyczne kompaktowanie podczas tworzenia tabeli:

df.write.option('delta.autoOptimize.autoCompact', 'true').saveAsTable('dbo.table_name')

Włącz tę samą właściwość tabeli w istniejącej tabeli:

ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Zmniejszenie nakładu pracy na ocenę

Począwszy od środowiska uruchomieniowego Spark platformy Fabric w wersji 2.0 (Delta 4.1) można włączyć tryb onCheckpointOnly automatycznej kompaktacji. Domyślnie automatyczne kompaktowanie ocenia metadane plików po każdej operacji zapisu w celu określenia, czy tabela ma zbyt wiele małych plików. W programie onCheckpointOnlyocena jest odroczona w celu rejestrowania operacji tworzenia punktów kontrolnych (zazwyczaj co 10 zatwierdzeń). W czasie punktu kontrolnego migawka tabeli jest już w pełni zrekonstruowana, więc ocena odczytuje dane z metadanych, które są już w pamięci, a nie wymagają dodatkowego skanowania. Odroczone przetwarzanie zmniejsza narzut związany z każdym zatwierdzeniem, a jednocześnie zapewnia okresowe kompaktowanie tabel.

SET spark.microsoft.delta.autoCompact.onCheckpointOnly.enabled = TRUE