Udostępnij za pośrednictwem


Używanie płynnego klastrowania dla tabel delty

Klasteryzacja płynna Delta Lake zastępuje partycjonowanie tabel i ZORDER, upraszczając decyzje dotyczące układu danych oraz optymalizując wydajność zapytań. Płynne klastrowanie zapewnia elastyczność w zakresie redefiniowania kluczy klastrowania bez konieczności przepisywania istniejących danych, umożliwiając ewolucję układu danych wraz z potrzebami analitycznymi w czasie. Klastrowanie cieczy dotyczy zarówno tabel przetwarzanych strumieniowo, jak i widoków zmaterializowanych.

Ważne

Usługa Databricks zaleca używanie środowiska Databricks Runtime 15.2 lub nowszego dla wszystkich tabel z włączonym klastrowaniem płynnym. Publiczna wersja zapoznawcza z ograniczeniami jest dostępna w środowisku Databricks Runtime 13.3 LTS i nowszym.

Uwaga

Tabele z włączonym klastrowaniem płynnym obsługują współbieżność na poziomie wiersza w środowisku Databricks Runtime 13.3 LTS lub nowszym. Współbieżność na poziomie wiersza jest ogólnie dostępna w środowisku Databricks Runtime 14.2 lub nowszym dla wszystkich tabel z włączonymi wektorami usuwania. Zobacz Poziomy izolacji i konflikty zapisu na platformie Azure Databricks.

Do czego służy klastrowanie płynne?

Databricks zaleca zastosowanie grupowania płynnego dla wszystkich nowych tabel Delta, w tym tabel przesyłania strumieniowego (TP) i zmaterializowanych widoków (ZW). Poniżej przedstawiono przykłady scenariuszy, które korzystają z klastrowania:

  • Tabele często filtrowane według kolumn o wysokiej kardynalności.
  • Tabele ze znaczną niesymetrycznością w dystrybucji danych.
  • Tabele, które szybko się rozrastają i wymagają prac konserwacyjnych oraz optymalizacji.
  • Tabele wymagające współbieżnego zapisu.
  • Tabele ze wzorcami dostępu, które zmieniają się w czasie.
  • Tabele, w których typowy klucz partycji może prowadzić do zbyt wielu lub zbyt niewielu partycji.

Włącz klastrowanie liquid

Klastrowanie płynne można włączyć w istniejącej tabeli lub podczas tworzenia tabeli. Klastrowanie nie jest zgodne z partycjonowaniem lub ZORDER, i wymaga użycia usługi Azure Databricks do zarządzania wszystkimi operacjami układu i optymalizacji dla danych w tabeli. Po włączeniu klastrowania płynnego uruchom OPTIMIZE zadania tak jak zwykle, aby przyrostowo klastrować dane. Zobacz Jak wyzwalać klastrowanie.

Aby włączyć klastrowanie cieczy, dodaj kod CLUSTER BY do instrukcji tworzenia tabeli, jak w poniższych przykładach:

Uwaga

W środowisku Databricks Runtime 14.2 lub nowszym można użyć interfejsów API DataFrame i DeltaTable w językach Python lub Scala, aby włączyć klastrowanie dynamiczne.

SQL

-- Create an empty table
CREATE TABLE table1(col0 int, col1 string) CLUSTER BY (col0);

-- Using a CTAS statement
CREATE EXTERNAL TABLE table2 CLUSTER BY (col0)  -- specify clustering after table name, not in subquery
LOCATION 'table_location'
AS SELECT * FROM table1;

-- Using a LIKE statement to copy configurations
CREATE TABLE table3 LIKE table1;

Python

# Create an empty table
(DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute())

# Using a CTAS statement
df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")

# CTAS using DataFrameWriterV2
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Scala

// Create an empty table
DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute()

// Using a CTAS statement
val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")

// CTAS using DataFrameWriterV2
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

W środowisku Databricks Runtime 16.0 lub nowszym można tworzyć tabele z włączonym klastrowaniem płynnym przy użyciu zapisów ze strukturą przesyłania strumieniowego, jak w następujących przykładach:

Python

(spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column_name")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")
)

Scala

spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column_name")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")

Ostrzeżenie

Tabele utworzone z włączonym grupowaniem w trybie płynnym mają wiele funkcji tabeli Delta włączone przy tworzeniu i używają wersję zapisywania Delta 7 i wersję czytnika 3. Możesz przestawić włączenie niektórych z tych funkcji. Zobacz Zmiana domyślnego sposobu włączania funkcji (opcjonalnie).

Nie można obniżyć wersji protokołu tabel, a tabele z włączonym klastrowaniem nie są czytelne dla klientów usługi Delta Lake, które nie obsługują wszystkich funkcji tabel protokołu czytnika różnicowego. Zobacz artykuł Jak usługa Azure Databricks zarządza zgodnością funkcji usługi Delta Lake?.

Klaster płynny można włączyć w istniejącej niepartycyjnej tabeli delty przy użyciu następującej składni:

ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)

Ważne

Domyślne zachowanie nie stosuje klastrowania do wcześniej zapisanych danych. Aby wymusić ponowne grupowanie dla wszystkich rekordów, należy użyć OPTIMIZE FULL. Zobacz Rekategoryzacja wszystkich rekordów.

Aby usunąć klucze klastrowania, użyj następującej składni:

ALTER TABLE table_name CLUSTER BY NONE;

automatyczne klastrowanie cieczy

Ważne

Automatyczne klastrowanie płynne jest w wersji publicznej zapoznawczej .

W środowisku Databricks Runtime 15.4 LTS i nowszych można włączyć automatyczne klastrowanie liquid dla tabel zarządzanych przez Unity Catalog. Po włączeniu automatycznego klastrowania płynnego usługa Azure Databricks inteligentnie wybiera klucze klastrowania w celu zoptymalizowania wydajności zapytań. Umożliwiasz automatyczne klastrowanie cieczy przy użyciu klauzuli CLUSTER BY AUTO.

Po włączeniu automatyczne wybieranie klucza i operacje klastrowania są uruchamiane asynchronicznie jako operacja konserwacji i wymagają włączenia optymalizacji predykcyjnej dla tabeli. Zobacz optymalizację predykcyjną dla tabel zarządzanych przez katalog Unity.

Aby zidentyfikować klucze klastrowania, usługa Azure Databricks analizuje historyczne obciążenie zapytań dla tabeli i identyfikuje najlepsze kolumny kandydatów. Klucze klastrowania są zmieniane, gdy przewidywane oszczędności kosztów wynikające z ulepszeń pomijania danych przewyższają koszt klastrowania danych.

Jeśli sposób wykonywania zapytań dotyczących danych zmienia się w czasie lub wydajność zapytań wskazuje zmiany w dystrybucjach danych, automatyczne klastrowanie liquid wybiera nowe klucze w celu zoptymalizowania wydajności.

Uwaga

Tabele można odczytywać lub zapisywać z automatycznym klastrowaniem włączonym ze wszystkich wersji środowiska Databricks Runtime, które obsługują klastrowanie płynne, ale wybór inteligentnego klucza opiera się na metadanych wprowadzonych w środowisku Databricks Runtime 15.4 LTS. Użyj środowiska Databricks Runtime 15.4 LTS lub nowszego, aby zapewnić, że automatycznie wybrane klucze optymalizują działanie wszystkich obciążeń i że te obciążenia są uwzględniane przy wyborze nowych kluczy.

Włączanie lub wyłączanie automatycznego klastrowania

Aby utworzyć nową tabelę z włączonym automatycznym klastrowaniem liquid, użyj następującej składni:

CREATE OR REPLACE TABLE table_name CLUSTER BY AUTO;

Można również włączyć automatyczne klastrowanie cieczy w istniejącej tabeli, łącznie z tabelami, które miały wcześniej ręcznie określone klucze, jak pokazano w poniższym przykładzie.

ALTER TABLE table_name CLUSTER BY AUTO;

Można również zmieniać tabele z włączonym automatycznym klastrowaniem liquid, aby używać ręcznie określonych kluczy.

Uwaga

Właściwość clusterByAuto jest ustawiona na true po włączeniu automatycznego klastrowania cieczy. Właściwość clusteringColumns pokazuje bieżące kolumny klastrowania wybrane przez automatyczny wybór klucza. Uruchom DESCRIBE EXTENDED table_name, aby wyświetlić pełną listę właściwości tabeli.

Zastąpij domyślne włączanie funkcji (opcjonalnie)

Można zastąpić domyślne zachowanie, które włącza funkcje tabeli delta podczas włączania klastrowania płynnego. Uniemożliwia to uaktualnianie protokołów czytników i składników zapisywania skojarzonych z tymi funkcjami tabeli. Aby wykonać następujące czynności, musisz mieć istniejącą tabelę:

  1. Użyj ALTER TABLE do ustawienia właściwości tabeli, która wyłącza jedną lub więcej funkcji. Aby na przykład wyłączyć wektory usuwania, uruchom następujące polecenie:

    ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
    
  2. Włącz klastrowanie płynów w tabeli, uruchamiając następujące polecenie:

    ALTER TABLE <table_name>
    CLUSTER BY (<clustering_columns>)
    

Poniższa tabela zawiera informacje na temat funkcji delta, które można zastąpić i jak włączenie ma wpływ na zgodność z wersjami środowiska Databricks Runtime.

Funkcja delta Zgodność środowiska uruchomieniowego Właściwość do zastąpienia włączania Wpływ wyłączenia na klastrowanie cieczy
Wektory usuwania Operacje odczytu i zapisu wymagają środowiska Databricks Runtime 12.2 LTS lub nowszego. 'delta.enableDeletionVectors' = false Współbieżność na poziomie wiersza jest wyłączona, co zwiększa prawdopodobieństwo konfliktu transakcji i operacji klastrowania. Zobacz Konflikty zapisu związane ze współbieżnością na poziomie wierszy.
DELETE, MERGE i UPDATE polecenia mogą działać wolniej.
Śledzenie wierszy Zapisy wymagają środowiska Databricks Runtime 13.3 LTS lub nowszego. Można odczytywać z dowolnej wersji środowiska Databricks Runtime. 'delta.enableRowTracking' = false Współbieżność na poziomie wiersza jest wyłączona, co zwiększa prawdopodobieństwo konfliktu transakcji i operacji klastrowania. Zobacz Konflikty zapisu ze współbieżnością na poziomie wiersza.
Punkty kontrolne w wersji 2 Operacje odczytu i zapisu wymagają środowiska Databricks Runtime 13.3 LTS lub nowszego. 'delta.checkpointPolicy' = 'classic' Brak wpływu na zachowanie klastrowania cieczy.

Wybieranie kluczy klastrowania

Databricks zaleca automatyczne klastrowanie cieczy dla obsługiwanych tabel. Zobacz Automatyczne klastrowanie cieczy.

Usługa Databricks zaleca wybranie kluczy klastrowania na podstawie kolumn najczęściej używanych w filtrach zapytań. Klucze klastrowania można zdefiniować w dowolnej kolejności. Jeśli dwie kolumny są wysoce skorelowane, wystarczy dołączyć tylko jedną z nich jako klucz klastrowania.

Można określić maksymalnie cztery klucze klastrowania. W przypadku mniejszych tabel (poniżej 10 TB) użycie większej liczby kluczy klastrowania (na przykład czterech) może obniżyć wydajność podczas filtrowania w jednej kolumnie w porównaniu z użyciem mniejszej liczby kluczy klastrowania (na przykład dwóch). Jednak wraz ze wzrostem rozmiaru tabeli różnica w wydajności przy użyciu większej liczby kluczy klastrowania dla zapytań jednokolumnach staje się nieznaczna.

Można określić tylko kolumny, które mają statystyki zebrane jako klucze klastrowania. Domyślnie pierwsze 32 kolumny w tabeli Delta mają zebrane statystyki. Zobacz Określ kolumny statystyk Delta.

Klaster obsługuje następujące typy danych dla kluczy klastrowania:

  • Data
  • Sygnatura czasowa
  • TimestampNTZ (wymaga środowiska Databricks Runtime 14.3 LTS lub nowszego)
  • String
  • Liczba całkowita
  • Długi
  • Krótkie
  • Liczba zmiennoprzecinkowa
  • Podwójny
  • Dziesiętne
  • Byte

Jeśli konwertujesz istniejącą tabelę, rozważ następujące zalecenia:

Bieżąca technika optymalizacji danych Zalecenie dotyczące kluczy klastrowania
Partycjonowanie w stylu Hive Użyj kolumn partycji jako kluczy klastrowania.
Indeksowanie kolejności Z ZORDER BY Użyj kolumn jako kluczy klastrowania.
Partycjonowanie w stylu Hive i porządek Z Użyj zarówno kolumn partycji, jak i ZORDER BY kolumn jako kluczy klastrowania.
Wygenerowane kolumny w celu zmniejszenia kardynalności (na przykład daty dla znacznika czasu) Użyj oryginalnej kolumny jako klucza klastrowania i nie twórz wygenerowanej kolumny.

Zapisywanie danych w tabeli klastrowanej

Należy użyć klienta do zapisu Delta, który obsługuje wszystkie funkcje tabel protokołu zapisu Delta używane przez klastrowanie typu liquid. W usłudze Azure Databricks musisz użyć środowiska Databricks Runtime 13.3 LTS lub nowszego.

Operacje zgrupowane wokół zapisu obejmują:

  • Operacje INSERT INTO
  • CTAS i RTAS instrukcje
  • COPY INTO z formatu Parquet
  • spark.write.mode("append")

Zorganizowane przesyłanie strumieniowe nigdy nie wyzwala klastrowania podczas zapisu. Obowiązują dodatkowe ograniczenia. Zobacz Ograniczenia.

Klastrowanie podczas zapisu jest wyzwalane tylko wtedy, gdy dane w transakcji spełniają próg rozmiaru. Te progi różnią się w zależności od liczby kolumn do klastrowania i są niższe dla tabel zarządzanych przez Unity Catalog niż dla innych tabel Delta.

Liczba kolumn klastrowania Próg rozmiaru tabel zarządzanych w Katalogu Unity Rozmiar progu dla innych tabel delty
1 64 MB 256 MB
2 256 MB 1 GB
3 512 MB 2 GB
4 1 GB 4 GB

Ponieważ nie wszystkie operacje stosują "liquid clustering", Databricks zaleca częste uruchamianie OPTIMIZE, aby zapewnić efektywne klastrowanie wszystkich danych.

Jak wyzwalać klastrowanie

** Optymalizacja predykcyjna automatycznie uruchamia OPTIMIZE polecenia dla włączonych tabel. Zobacz Optymalizacja predykcyjna dla tabel zarządzanych w katalogu Unity.

Aby uruchomić klastrowanie, należy użyć Databricks Runtime w wersji 13.3 LTS lub nowszej. Użyj polecenia OPTIMIZE na swojej tabeli, jak w poniższym przykładzie:

OPTIMIZE table_name;

Klastrowanie typu "liquid" jest przyrostowe, co oznacza, że dane są ponownie zapisywane tylko w razie potrzeby, aby uwzględnić te dane, które wymagają klastrowania. Pliki danych z kluczami klastrowania, które nie pasują do danych, które mają być klastrowane, nie są przepisane.

Aby uzyskać najlepszą wydajność, Databricks zaleca planowanie regularnych OPTIMIZE zadań w celu klastrowania danych. Dla tabel, które często są aktualizowane lub podlegają operacjom wstawiania, Databricks zaleca, aby zaplanować OPTIMIZE zadanie co jedną lub dwie godziny. Ponieważ klastrowanie płynów jest przyrostowe, większość zadań dla tabel klastrowanych jest uruchamiana szybko.

Wymuszenie ponownego klastrowania wszystkich rekordów

W środowisku Databricks Runtime 16.0 lub nowszym można wymusić ponowne rejestrowanie wszystkich rekordów w tabeli przy użyciu następującej składni:

OPTIMIZE table_name FULL;

Ważne

Uruchamianie OPTIMIZE FULL ponownie grupuje wszystkie istniejące dane zgodnie z potrzebami. W przypadku dużych tabel, które nie zostały wcześniej klastrowane na określonych kluczach, ta operacja może potrwać kilka godzin.

Uruchom OPTIMIZE FULL po włączeniu klastrowania po raz pierwszy lub zmianie kluczy klastrowania. Jeśli wcześniej uruchomiono OPTIMIZE FULL i nie nastąpiła zmiana kluczy klastrowania, OPTIMIZE FULL działa tak samo jak OPTIMIZE. Zawsze używaj OPTIMIZE FULL, aby upewnić się, że układ danych odzwierciedla bieżące klucze klastrowania.

Odczytywanie danych z tabeli klastrowanej

Dane w tabeli klastrowanej można odczytywać przy użyciu dowolnego klienta usługi Delta Lake obsługującego odczytywanie wektorów usuwania. Aby uzyskać najlepsze wyniki zapytań, uwzględnij klucze klastrowania w filtrach zapytań, jak w poniższym przykładzie:

SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";

Zmienianie kluczy klastrowania

Klucze klastrowania dla tabeli można zmienić w dowolnym momencie, uruchamiając ALTER TABLE polecenie, jak w poniższym przykładzie:

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

W przypadku zmiany kluczy klastrowania, kolejne operacje OPTIMIZE i zapisu używają nowego podejścia do klastrowania, ale istniejące dane nie zostaną przepisane.

Klastrowanie można również wyłączyć, ustawiając klucze na NONE, jak w poniższym przykładzie:

ALTER TABLE table_name CLUSTER BY NONE;

Ustawienie kluczy klastra na NONE nie powoduje ponownego zapisywania danych, które zostały już klastrowane, ale uniemożliwia wykonywanie przyszłych OPTIMIZE operacji przy użyciu kluczy klastrowania.

Zobacz, jak tabela jest klastrowana

Możesz użyć DESCRIBE poleceń, aby wyświetlić klucze klastrowania dla tabeli, jak w następujących przykładach:

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

Zgodność tabel z klastrowaniem płynnym

Tabele utworzone przy użyciu płynnego klastrowania w środowisku Databricks Runtime 14.1 lub nowszym używają domyślnie punktów kontrolnych w wersji 2. Tabele można odczytywać i zapisywać przy użyciu punktów kontrolnych w wersji 2 w środowisku Databricks Runtime 13.3 LTS lub nowszym.

Możesz wyłączyć punkty kontrolne v2 i obniżyć wersję protokołów tabel, aby odczytywać tabele z klastrowaniem płynnym w środowisku Databricks Runtime 12.2 LTS i nowszym. Zobacz Funkcje tabeli Delta dotyczące usuwania.

Ograniczenia

Istnieją następujące ograniczenia:

  • W środowisku Databricks Runtime 15.1 lub starszym klastrowanie przy zapisie nie obsługuje zapytań źródłowych obejmujących filtry, sprzężenia ani agregacje.
  • Obciążenia związane z przesyłaniem strumieniowym ze strukturą nie obsługują klastrowania podczas zapisu.
  • W Databricks Runtime 15.4 LTS i w niższych wersjach nie można utworzyć tabeli z włączonym klastrowaniem płynnym przy użyciu Structured Streaming. Można używać strumieniowego przetwarzania danych ze strukturą do zapisywania danych w istniejącej tabeli z włączonym klastrowaniem płynnym.