Udostępnij przez


Kompaktowanie tabel Delta

Podobnie jak systemy plików i relacyjne bazy danych, dane stają się fragmentowane w czasie, chyba że są ściśle zarządzane, co prowadzi do nadmiernego kosztu obliczeń w celu odczytania danych. Delta Lake nie jest wyjątkiem. Pliki danych powinny być okresowo przepisywane w optymalnym układzie, aby zmniejszyć koszty poszczególnych operacji na plikach, poprawić kompresję danych i zoptymalizować równoległość odczytu. Polecenie OPTIMIZE rozwiązuje to wyzwanie: grupuje małe pliki w partycji w pojemniki przeznaczone dla idealnego rozmiaru pliku i ponownie zapisuje je w pamięci. Wynikiem jest to, że te same dane są kompaktowane w mniej plików.

Metody kompaktowania

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

Ważne

Chociaż OPTIMIZE jest operacją idempotentną (co oznacza, że uruchomienie jej dwa razy z rzędu nie powoduje ponownego zapisania żadnych danych), użycie minFileSize o rozmiarze większym niż rozmiar tabeli Delta może spowodować amplifikację zapisu, co czyni operację bardziej kosztowną obliczeniowo niż jest to konieczne. Jeśli na przykład minFileSize jest ustawione na 1 GB i w tabeli znajduje się plik o rozmiarze 900 MB, to ten plik zostanie przepisany, gdy OPTIMIZE zostanie uruchomiony po tym, jak do tabeli zostanie zapisany mały plik o rozmiarze 1 KB. Aby uzyskać wskazówki dotyczące automatycznego zarządzania rozmiarem pliku, zobacz dokumentację adaptacyjnego rozmiaru pliku docelowego .

OPTIMIZE z kolejnością Z

Po określeniu klauzuli ZORDER BY, OPTIMIZE ponownie zapisuje wszystkie aktywne pliki, tak aby wiersze z podobnymi wartościami dla kolumn z-order były umieszczane razem w tych samych plikach, co zwiększa skuteczność pomijania plików dla zapytań filtrujących te kolumny. 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 spowodować, że w cyklu życia tabel różnicowych przepisuje się mniej danych. Jak pokazano na poniższym diagramie, szybka optymalizacja pomija kompaktowanie nieoptymalnych pojemników. W rezultacie szybciej wykonywane i bardziej idempotentne są zadania OPTIMIZE, a także następuje redukcja wzmocnienia 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 wzmocnienie zapisu, ponieważ rozmiar docelowy kompaktowania zmienia się z czasem (na przykład poprzez ocenę adaptacyjnego rozmiaru docelowego pliku i ustawienie 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.

Ustaw na poziomie sesji, aby włączyć automatyczne kompaktowanie w nowych tabelach:

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

Ustaw na poziomie tabeli, aby włączyć tylko dla wybranych tabel:

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

Użyj opcji DataFrameWriter, aby włączyć w nowych tabelach:

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

Włącz dla istniejących tabel:

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

Działanie automatycznego kompaktowania można dostosować za pomocą następujących konfiguracji 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

Uwaga / Notatka

Microsoft zaleca używanie automatycznego kompaktowania zamiast planowania OPTIMIZE zadań. Automatyczne procesy kompaktowania zwykle przewyższają zaplanowane procesy kompaktowania pod względem maksymalizacji wydajności odczytu/zapisu i często eliminują obciążenie związane z kodowaniem, planowaniem i optymalizowaniem częstotliwości uruchamiania tych zaplanowanych procesów. Automatyczne kompaktowanie jest zalecane, gdy cele poziomu usługi przetwarzania danych tolerują dodatkowe opóźnienia z automatycznego kompaktowania uruchamianego, gdy jest to potrzebne. Jeśli wymagania dotyczące opóźnienia danych są rygorystyczne, bardziej efektywne może być zaplanowanie uruchamiania optymalizacji w oddzielnej puli Spark, dzięki czemu operacje zapisu nie doświadczą okresowych skoków ze względu na wyzwalanie synchronicznych operacji kompaktowania.

Ważne

Chociaż kompaktowanie jest strategią krytyczną do użycia, należy ją również odpowiednio sparować z unikaniem zapisywania małych plików za pośrednictwem funkcji, takich jak optymalizacja zapisu. Aby uzyskać więcej informacji, zobacz wskazówki dotyczące optymalizowania zapisu.

Utrzymanie tabeli Lakehouse

Użytkownicy mogą uruchamiać operacje konserwacji ad hoc, takie jak OPTIMIZE z interfejsu użytkownika usługi Lakehouse. Aby uzyskać więcej informacji, zobacz Konserwacja tabel lakehouse.

Podsumowanie najlepszych rozwiązań

  • Włącz automatyczne kompaktowanie dla pipeline'ów pobierania danych z częstymi małymi zapisami (przesyłanie strumieniowe lub mikrobatch), aby uniknąć ręcznego planowania i by pliki były kompaktowane automatycznie.
    • W przypadku innych wzorców zapisu korzystne może być włączenie jako ubezpieczenia przed gromadzeniem małych plików, ale rozważ, czy cele poziomu usług przetwarzania danych tolerują okresowe skoki czasu przetwarzania.
  • Zaplanuj operacje pełnej tabeli OPTIMIZE podczas cichych okien , gdy trzeba ponownie zapisać wiele partycji lub uruchomić polecenie Z-Order.
  • Włącz szybką optymalizację w celu zmniejszenia wzmacniania zapisu i zwiększenia OPTIMIZE idempotentności.
  • Włącz cele kompaktowania na poziomie plików, aby zapobiec amplifikacji zapisu w miarę wzrostu tabel i stosowania większych rozmiarów plików docelowych.
  • Pamiętaj, że kompaktowanie wstępne (optymalizowanie zapisu) jest mniej kosztowne niż kompaktowanie po zapisie (optymalizowanie). Zobacz dokumentację optymalizacji zapisu, aby uzyskać najlepsze praktyki.