Használjon folyadékalapú klaszterezést a Delta táblákhoz
A Delta Lake folyékony fürtözés felváltja a táblaparticionálást, és ZORDER
egyszerűsíti az adatelrendezési döntéseket és optimalizálja a lekérdezési teljesítményt. A folyékony fürtözés rugalmasságot biztosít a fürtözési kulcsok újradefiniálásához a meglévő adatok újraírása nélkül, így az adatok elrendezése az elemzési igények mellett idővel fejlődhet. A folyékony fürtözés a streamelő táblákra és a materializált nézetekre is vonatkozik.
Fontos
A Databricks azt javasolja, hogy a Databricks Runtime 15.2 és újabb verzióját használják minden olyan táblához, amelynél engedélyezve van a folyékony fürtözés. A databricks runtime 13.3 LTS-ben és újabb verziókban elérhető a nyilvános előzetes verzió támogatása korlátozásokkal.
Feljegyzés
A táblák, amelyeknél engedélyezett a folyékony fürtözés, támogatják a sorszintű egyidejűséget a Databricks Runtime 13.3 LTS és újabb verziókban. A sorszintű egyidejűség általánosan elérhető a Databricks Runtime 14.2-es és újabb verziókban minden olyan táblához, amelyen engedélyezve van a törlési vektor. Lásd: Elkülönítési szintek és írási ütközések az Azure Databricksben.
Mire használható a folyékony fürtözés?
A Databricks minden új Delta-táblához javasolja a liquid clusteringet, amely magában foglalja a streamelő táblákat (ST-ket) és a materializált nézeteket (MV-ket). A következő példák olyan forgatókönyveket mutatnak be, amelyeknél előnyös a klaszterezés:
- A táblázatok gyakran nagy kardinálisságú oszlopok alapján szűrnek.
- Az adatok eloszlásában jelentős ferdeséget mutató táblázatok.
- Gyorsan növekvő, karbantartást és hangolást igénylő táblák.
- Egyidejű írási követelményekkel rendelkező táblák.
- Idővel változó hozzáférési mintákkal rendelkező táblák.
- Olyan táblák, ahol egy tipikus partíciós kulcs túl sok vagy túl kevés partíciót hagyhat a táblában.
Folyékony klaszterezés engedélyezése
Engedélyezheti a "liquid clustering"-et egy meglévő táblán vagy a tábla létrehozása során. A fürtözés nem kompatibilis a particionálással vagy a ZORDER
elemmel, és az Azure Databricks használatát igényli a táblájában lévő adatok összes elrendezési és optimalizálási műveletének kezeléséhez. A folyékony klaszterezés engedélyezése után a szokásos módon futtassa a OPTIMIZE
feladatokat, hogy az adatokat fokozatosan fürtözze. Tekintse meg a fürtözés indításának módját.
A folyékony fürtözés engedélyezéséhez adja hozzá a CLUSTER BY
kifejezést egy táblalétrehozási utasításhoz, az alábbi példákhoz hasonlóan:
Feljegyzés
A Databricks Runtime 14.2-es és újabb verziójában a DataFrame API-kat és a DeltaTable API-kat használhatja Pythonban vagy Scalában a folyékony fürtözés engedélyezéséhez.
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()
A Databricks Runtime 16.0-s vagy újabb verziójában, strukturált streamelési műveletek használatával, folyékony fürtözést engedélyező táblákat hozhat létre, ahogyan az alábbi példák mutatják.
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")
Figyelmeztetés
A folyékony fürtözéssel létrehozott táblák esetében a létrehozáskor számos Delta-táblafunkció be van kapcsolva, és a Delta író 7-es verzióját, valamint az olvasó 3-as verzióját használják. Ezen funkciók némelyikének engedélyezését felülbírálhatja. Lásd: Alapértelmezett funkció engedélyezése felülbírálása (nem kötelező).
A táblákhoz tartozó protokollverziók nem alakíthatók vissza, és a fürtözést engedélyező táblák nem olvashatók azokkal a Delta Lake kliensekkel, amelyek nem támogatják az összes engedélyezett Delta-olvasói protokolltáblázati funkciót. Lásd: Hogyan kezeli az Azure Databricks a Delta Lake funkció kompatibilitását?.
Egy meglévő nem particionált Delta-táblán engedélyezheti a folyékony fürtözést az alábbi szintaxissal:
ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)
Fontos
Az alapértelmezett viselkedés nem alkalmazza a fürtözést a korábban írt adatokra. Az összes rekord újracsoportosításának kényszerítéséhez a OPTIMIZE FULL
-t kell használnia. Lásd Az összes rekord kényszerű újracsoportosítását.
A fürtözési kulcsok eltávolításához használja az alábbi szintaxist:
ALTER TABLE table_name CLUSTER BY NONE;
Automatikus folyadékcsoportosítás
Fontos
Az automatikus folyékony fürtözés nyilvános előzetes.
A Databricks Runtime 15.4 LTS-ben és újabb verziókban engedélyezheti az automatikus folyékony klaszterezést a Unity Catalog által kezelt táblákon. Amikor az automatikus csoportosítás engedélyezve van, az Azure Databricks intelligens módon választja ki a csoportosítási kulcsokat a lekérdezési teljesítmény optimalizálása érdekében. A CLUSTER BY AUTO
záradék használatával engedélyezheti az automatikus folyékony fürtözést.
Ha engedélyezve van, az automatikus kulcskiválasztási és fürtözési műveletek aszinkron módon futnak karbantartási műveletként, és megkövetelik, hogy a prediktív optimalizálás engedélyezve legyen a táblához. Lásd: A Unity Catalog által felügyelt táblák prediktív optimalizálása.
A klaszterezési kulcsok azonosítása érdekében az Azure Databricks elemzi a tábla történeti lekérdezési munkafolyamatot, és azonosítja a legalkalmasabb oszlopokat. A klaszterezési kulcsok akkor változnak, ha az adatok kihagyása által előrejelzett költségmegtakarítás meghaladja az adatok klaszterezésének költségeit.
Ha az adatok lekérdezésének módja idővel változik, vagy a lekérdezési teljesítmény az adateloszlás változásait jelzi, az automatikus folyékony klaszterezés új kulcsokat választ a teljesítmény optimalizálása érdekében.
Feljegyzés
A liquid clustering technológiával támogatott összes Databricks Runtime-verzióból olvashat vagy írhat automatikus fürtözéssel engedélyezett táblákat, de az intelligens kulcsválasztás a Databricks Runtime 15.4 LTS-ben bevezetett metaadatokra támaszkodik. A Databricks Runtime 15.4 LTS vagy újabb verziójával biztosíthatja, hogy az automatikusan kiválasztott kulcsok az összes számítási feladat számára előnyösek legyenek, és hogy ezek a számítási feladatok figyelembe legyenek véve az új kulcsok kiválasztásakor.
Automatikus fürtözés engedélyezése vagy letiltása
Ha olyan új táblát szeretne létrehozni, amelyen engedélyezve van az automatikus folyékony fürtözés, használja az alábbi szintaxist:
CREATE OR REPLACE TABLE table_name CLUSTER BY AUTO;
Az automatikus csoportosítást egy meglévő táblán is engedélyezheti, beleértve azokat a táblákat is, amelyeknél korábban manuálisan megadott kulcsok voltak, amint azt az alábbi példában látható.
ALTER TABLE table_name CLUSTER BY AUTO;
A táblákat, amelyeknél be van kapcsolva az automatikus folyékony csoportosítás, úgy is módosíthatja, hogy manuálisan megadott kulcsokat használjanak.
Feljegyzés
Az automatikus folyékony fürtözés engedélyezésekor a clusterByAuto
tulajdonság true
értékre van állítva.
A clusteringColumns
tulajdonság az automatikus kulcskijelöléssel kiválasztott aktuális fürtözési oszlopokat jeleníti meg. Futtassa a DESCRIBE EXTENDED table_name
-t a táblatulajdonságok teljes listájának megtekintéséhez.
Alapértelmezett funkció engedélyezésének felülbírálása (nem kötelező)
Felülbírálhatja az alapértelmezett viselkedést, amely lehetővé teszi a Delta-tábla funkcióit a folyékony fürtözés engedélyezése során. Ez megakadályozza a táblafunkciókhoz társított olvasói és írói protokollok frissítését. A következő lépések végrehajtásához rendelkeznie kell egy meglévő táblával:
Egy vagy több funkciót letiltó táblatulajdonság beállítására használható
ALTER TABLE
. A törlési vektorok letiltásához például futtassa a következőket:ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
Engedélyezze a folyékony klaszterezést a táblázaton a következő futtatásával:
ALTER TABLE <table_name> CLUSTER BY (<clustering_columns>)
Az alábbi táblázat a felülbírálható Delta-funkciókról és arról nyújt tájékoztatást, hogy az engedélyezés milyen hatással van a Databricks Runtime-verziókkal való kompatibilitásra.
Delta funkció | Futtatókörnyezet kompatibilitása | A tulajdonság, amely felülírja az engedélyezést | A kikapcsolás hatása a folyadékcsoportosulásra |
---|---|---|---|
Törlési vektorok | Az olvasáshoz és az íráshoz a Databricks Runtime 12.2 LTS és újabb verziója szükséges. | 'delta.enableDeletionVectors' = false |
A sorszintű egyidejűség le van tiltva, így a tranzakciók és a fürtözési műveletek nagyobb valószínűséggel ütköznek. Lásd: Írási ütközések sorszintű egyidejűséggel kapcsolatban.DELETE , MERGE és UPDATE a parancsok lassabban futnak. |
Sorkövetés | Az íráshoz a Databricks Runtime 13.3 LTS és újabb verziója szükséges. Bármely Databricks Runtime-verzióból olvasható. | 'delta.enableRowTracking' = false |
A sorszintű egyidejűség le van tiltva, így a tranzakciók és a fürtözési műveletek nagyobb valószínűséggel ütköznek. Lásd: Írási ütközések sorszintű párhuzamossággal. |
Ellenőrzőpontok V2 | Az olvasáshoz és az íráshoz a Databricks Runtime 13.3 LTS és újabb verziója szükséges. | 'delta.checkpointPolicy' = 'classic' |
Nincs hatással a folyékony fürtözés viselkedésére. |
Fürtözési kulcsok kiválasztása
A Databricks folyékony klaszterezés automatikus alkalmazását javasolja a támogatott táblák esetében. Lásd: Automatikus folyadékfürtözés.
A Databricks azt javasolja, hogy a fürtözési kulcsokat a lekérdezésszűrőkben leggyakrabban használt oszlopok alapján válasszák ki. A fürtözési kulcsok bármilyen sorrendben meghatározhatók. Ha két oszlop nagyon korrelál, csak az egyiket kell ezek közül fürtözési kulcsként megadnia.
Legfeljebb négy fürtkulcsot adhat meg. Kisebb (10 TB alatti) táblák esetén a több fürtkulcs (például négy) használata csökkentheti a teljesítményt, ha egyetlen oszlopra szűr, szemben a kevesebb fürtözési kulcs (például kettő) használatával. A táblázat méretének növekedésével azonban a teljesítménybeli különbség az egyoszlopos lekérdezések több fürtözési kulcsának használatával elhanyagolhatóvá válik.
Csak olyan oszlopokat adhat meg, amelyek statisztikai adatai fürtözési kulcsként vannak rögzítve. Alapértelmezés szerint a Delta tábla első 32 oszlopa statisztikai adatokat gyűjt. Lásd: Deltastatisztikai oszlopok megadása.
A fürtözés a következő adattípusokat támogatja a fürtözési kulcsokhoz:
- Dátum
- Időbélyegző
- TimestampNTZ (a Databricks Runtime 14.3 LTS vagy újabb verziójára van szükség)
- Sztring
- Egész szám
- Hosszú
- Rövid
- Lebegőpontos értékek
- Kétszeres
- Decimális
- Bájt
Ha meglévő táblát konvertál, vegye figyelembe az alábbi javaslatokat:
Aktuális adatoptimalizálási technika | Javaslat a klaszterezési kulcsokra |
---|---|
Hive-stílusú particionálás | Partícióoszlopok használata fürtözési kulcsként. |
Z-order indexelés | Az ZORDER BY oszlopokat használja fürtözési kulcsként. |
Hive-stílusú particionálás és Z-sorrend | Használjon partícióoszlopokat és ZORDER BY oszlopokat is fürtözési kulcsként. |
Számosság csökkentésére generált oszlopok (például az időbélyeg dátuma) | Használja az eredeti oszlopot klaszterezési kulcsként, és ne hozzon létre generált oszlopot. |
Adatok írása fürtözött táblába
Olyan Delta-íróügyfélt kell használnia, amely támogatja a folyékony fürtözés által használt Delta írási protokoll táblafunkcióit. Az Azure Databricksben a Databricks Runtime 13.3 LTS-t és újabb verziót kell használnia.
Az írási műveletekre összpontosító műveletek a következőket tartalmazzák:
-
INSERT INTO
műveletek -
CTAS
ésRTAS
állítások -
COPY INTO
parquet formátumból spark.write.mode("append")
A strukturált streamelési írások soha nem aktiválják a fürtözést íráskor. További korlátozások érvényesek. Lásd: Korlátozások.
Az írási fürtözés csak akkor aktiválódik, ha a tranzakció adatai elérik a méret küszöbértékét. Ezek a küszöbértékek a fürtözési oszlopok számától függően változnak, és a Unity Catalog által felügyelt táblák esetében alacsonyabbak, mint a többi Delta-tábla.
Klaszterezési oszlopok száma | A Unity Catalog által felügyelt táblák küszöbértékének mérete | Más Delta-táblák küszöbértékének mérete |
---|---|---|
1 | 64 MB | 256 MB |
2 | 256 MB | 1 GB |
3 | 512 MB | 2 GB |
4 | 1 GB | 4 GB |
Mivel nem minden művelet alkalmazza a liquid clusteringet, a Databricks azt javasolja, hogy gyakran futtassa a OPTIMIZE
-t, hogy az összes adat hatékonyan legyenek fürtözve.
Fürtözés aktiválása
A prediktív optimalizálás automatikusan futtat OPTIMIZE
parancsokat az engedélyezett táblákhoz. Lásd: A Unity Catalog által felügyelt táblák prediktív optimalizálása.
A fürtözés aktiválásához a Databricks Runtime 13.3 LTS vagy újabb verzióját kell használnia. Használja a OPTIMIZE
parancsot a táblán, ahogyan az alábbi példában is látható.
OPTIMIZE table_name;
** A folyékony klaszterezés növekményes, ami azt jelenti, hogy az adatok csak akkor lesznek újraírva, ha szükséges az adatok klaszterezési igényeinek kielégítésére. A fürtözendő adatoknak nem megfelelő fürtözési kulcsokkal rendelkező adatfájlok nem lesznek újraírva.
A legjobb teljesítmény érdekében a Databricks azt javasolja, hogy ütemezz rendszeres OPTIMIZE
feladatokat az adatok csoportosítására. A sok frissítést vagy beszúrást tapasztaló táblák esetében a Databricks azt javasolja, hogy egy feladatot egy vagy két óránként ütemezz OPTIMIZE
. Mivel a folyadékcsoportosítás fokozatos, a fürtözött táblák legtöbb OPTIMIZE
feladata gyorsan fut.
Az összes rekord újracsoportosításának kényszerítése
A Databricks Runtime 16.0-s és újabb verzióiban kényszerítheti egy tábla összes rekordjának újraelhelyezését az alábbi szintaxissal:
OPTIMIZE table_name FULL;
Fontos
A OPTIMIZE FULL
futtatása szükség esetén újracsoportosítja az összes meglévő adatot. Nagy tábláknál, amelyek nincsenek a megadott kulcsok szerint fürtözve, ez a művelet órákat is igénybe vehet.
Futtassa a OPTIMIZE FULL
parancsot, amikor először engedélyezi a fürtözést, vagy módosítja a fürtözési kulcsokat. Ha korábban már futtatta a OPTIMIZE FULL
-t, és a fürtkulcsok nem változtak, akkor a OPTIMIZE FULL
ugyanúgy fut, mint a OPTIMIZE
. Mindig használja a(z) OPTIMIZE FULL
-at, hogy az adatelrendezés pontosan tükrözze az aktuális fürtözési kulcsokat.
Adatok beolvasása klaszterezett táblából
A fürtözött táblákban lévő adatokat bármely olyan Delta Lake-ügyféllel olvashatja, amely támogatja a törlési vektorok olvasását. A legjobb lekérdezési eredmények érdekében a lekérdezésszűrőkbe foglalja bele a fürtözési kulcsokat, ahogyan az alábbi példában is látható:
SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";
Fürtözési kulcsok módosítása
A táblák fürtözési kulcsait bármikor módosíthatja egy ALTER TABLE
parancs futtatásával, ahogyan az alábbi példában is látható:
ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);
A fürtözési kulcsok módosításakor az azt követő OPTIMIZE
és az írási műveletek az új fürtözési módszert használják, de a meglévő adatok nem lesznek újraírva.
A fürtözést úgy is kikapcsolhatja, hogy a kulcsokat NONE
, a következő példában látható módon állítja be.
ALTER TABLE table_name CLUSTER BY NONE;
A fürtkulcsok NONE
beállítása nem írja át a már fürtözött adatokat, de megakadályozza, hogy a jövőbeli OPTIMIZE
műveletek fürtözési kulcsokat használjanak.
Látható, hogyan van a tábla csoportosítva
DESCRIBE
A parancsokkal megtekintheti egy tábla fürtözési kulcsait, ahogyan az alábbi példákban is látható:
DESCRIBE TABLE table_name;
DESCRIBE DETAIL table_name;
Kompatibilitás folyékony fürtözéssel rendelkező táblákhoz
A Databricks Runtime 14.1-ben és újabb verziókban folyékony fürtözéssel létrehozott táblák alapértelmezés szerint v2-ellenőrzőpontokat használnak. A Databricks Runtime 13.3 LTS és újabb verziókban v2-ellenőrzőpontokkal rendelkező táblákat olvashat és írhat.
v2-ellenőrzőpontok letiltásával és táblaprotokollok leminősítésével olvashat folyékony fürtözésű táblákat a Databricks Runtime 12.2 LTS és újabb verziókban. Lásd a Delta-tábla funkcióinak elvetése című témakört.
Korlátozások
Az alábbi korlátozások érvényesek:
- A Databricks Runtime 15.1-es és régebbi verziójában az írási fürtözés nem támogatja a szűrőket, illesztéseket vagy összesítéseket tartalmazó forráslekérdezéseket.
- A strukturált streamelési számítási feladatok nem támogatják a fürtözést íráskor.
- A Databricks Runtime 15.4 LTS-ben és az alábbi verziókban nem hozhat létre olyan táblát, amelyben engedélyezve van a folyékony csoportosítás strukturált stream írással. A strukturált streamelés használatával adatokat írhat egy meglévő táblába, amelyen engedélyezve van a dinamikus fürtözés.