Udostępnij za pośrednictwem


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 (1g) spark.databricks.delta.optimize.minFileSize
maxFileSize Rozmiar pliku docelowego wygenerowany przez OPTIMIZE polecenie . 1073741824 (1g) spark.databricks.delta.optimize.maxFileSize

OPTIMIZE jest idempotentny, ale zbyt duży minFileSize może zwiększyć amplifikację zapisu. Na przykład z ustawionym minFileSize na 1 GB plik o rozmiarze 900 MB może zostać przepisany po niewielkim dodatkowym zapisie. 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. To ulepsza proces pomijania plików w przypadku selektywnych filtrów. 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

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. Można zwiększyć tę wartość, aby bardziej konserwatywnie decydować o częstotliwości pomijania pojemników przez szybką optymalizację, lub ją zmniejszyć, aby umożliwić bardziej swobodne pomijanie pojemników.

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 małe pliki, które mogą osiągnąć minimalny rozmiar docelowy lub przekroczyć 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')

Dostrajanie progów automatycznej kompresji

Dostosuj zachowanie automatycznego kompaktowania, ustawiając następujące konfiguracje sesji Spark.

Majątek Description Wartość domyślna Konfiguracja sesji
maxFileSize Docelowy maksymalny rozmiar pliku w bajtach dla skompaktowanych plików. 134217728b (128 MB) spark.databricks.delta.autoCompact.maxFileSize
minFileSize Minimalny rozmiar pliku w bajtach, który ma zostać uznany za zwarty. Wszystkie elementy poniżej tego progu są brane pod uwagę w przypadku kompaktowania i liczone do minNumFiles progu. Domyślnie brak ustawienia, obliczane jako 1/2 wartości maxFileSize, chyba że jawnie ustawisz wartość. spark.databricks.delta.autoCompact.minFileSize
minNumFiles Minimalna liczba plików, które muszą istnieć poniżej minFileSize progu wyzwalania automatycznego kompaktowania. 50 spark.databricks.delta.autoCompact.minNumFiles

Wybierz między automatycznym kompaktowaniem a zaplanowaną optymalizacją

Firma Microsoft zaleca automatyczne kompaktowanie jako domyślną strategię większości obciążeń ładowania danych. Zwykle przewyższa stałe harmonogramy i zmniejsza koszty operacyjne związane z utrzymaniem OPTIMIZE zadań.

Jeśli masz ścisłe cele dotyczące opóźnień, zaplanowanie OPTIMIZE w oddzielnej puli Spark może być bardziej odpowiednie, ponieważ automatyczne kompaktowanie działa synchronicznie po zapisach.

Używaj kompaktowania razem z funkcjami zapobiegania małym plikom, takimi jak optymalizowanie zapisu. Aby uzyskać wskazówki, zobacz Optymalizowanie zapisu.

Utrzymanie tabeli Lakehouse

Możesz uruchamiać operacje konserwacji ad hoc, takie jak OPTIMIZE z poziomu Eksploratora usługi Lakehouse. Aby uzyskać więcej informacji, zobacz Konserwacja tabel lakehouse.

Podsumowanie najlepszych rozwiązań

Skorzystaj z tych zaleceń, aby zrównoważyć koszty zapisu, wydajność odczytu i obciążenie konserwacyjne na potrzeby kompaktowania tabeli delty.

  • Enable Auto compaction do pozyskiwania pipelines z częstymi małymi zapisami (przesyłanie strumieniowe lub mikrobatch) w celu zmniejszenia planowania ręcznego.
  • Używaj selektywnego auto kompaktowania dla innych wzorców zapisu gdy cele poziomu usługi są w stanie tolerować okazjonalne skoki opóźnień zapisu.
  • Zaplanuj pełną tabelę OPTIMIZE podczas cichych okien , gdy trzeba ponownie napisać wiele partycji lub zastosować kolejność Z.
  • Włącz szybką optymalizację w celu zmniejszenia wzmacniania zapisu i zwiększenia OPTIMIZE idempotentności.
  • Włącz cele kompaktowania na poziomie pliku , aby zmniejszyć niepotrzebne ponowne skompilowanie w miarę zwiększania rozmiaru pliku docelowego w miarę upływu czasu.
  • Użyj optymalizacji zapisu w odpowiednich ścieżkach pozyskiwania ponieważ kompaktowanie przed zapisem jest często mniej kosztowne niż kompaktowanie po zapisie. Aby uzyskać wskazówki, zobacz Optymalizowanie zapisu.