Sdílet prostřednictvím


Optimalizace tabulek Delta Lake a uspořádání V

Formát tabulky Lakehouse a Delta Lake jsou ústřední pro Microsoft Fabric a klíčovým požadavkem je, aby tabulky byly optimalizovány pro analýzy. Tato příručka popisuje koncepty, konfigurace a způsob optimalizace tabulek Delta Lake a jejich použití na nejběžnější vzory použití velkých objemů dat.

Co je V-Order?

V-Order je optimalizace doby zápisu do formátu souboru Parquet, která umožňuje bleskově rychlé čtení ve výpočetních modulech Microsoft Fabric, jako jsou Power BI, SQL, Spark a další.

Moduly Power BI a SQL využívají technologii Microsoft Verti-Scan a V-Ordered parquet soubory k dosažení doby přístupu k datům podobné přístupu v paměti. Spark a další výpočetní enginy jiné než Verti-Scan také těží z V-Ordered souborů s průměrně o 10 % rychlejším čtením, přičemž v některých scénářích až o 50 %.

V-Order funguje tím, že na soubory Parquet aplikuje speciální řazení, distribuci skupin řádků, kódování pomocí slovníku a kompresi, čímž vyžaduje méně síťových, diskových a procesorových prostředků ve výpočetních jednotkách, což zajišťuje nákladovou efektivitu a výkon. Řazení V-Order má 15% vliv na průměrné doby zápisu, ale poskytuje až 50% větší kompresi.

Je to 100% open-source kompatibilní s formátem Parquet. Všechny parquet enginy ho můžou číst jako běžné soubory Parquet. Delta tabulky jsou efektivnější než kdy dřív a funkce jako Z-Order jsou kompatibilní s V-Order. Vlastnosti tabulky a optimalizační příkazy lze využít ke kontrole V-Order jejích oddílů.

V-Order se použije na úrovni parquetového souboru. Tabulky Delta a jejich funkce, jako jsou Z-Order, komprimace, vakuování, časové cestování atd., jsou ortogonální k V-Order, a jsou tedy kompatibilní a mohou být použity společně pro další výhody.

Řízení zápisů do V-Order

Pořadí V-Order je ve výchozím nastavení povolené v Microsoft Fabric a v Apache Sparku je řízeno následujícími konfiguracemi.

Konfigurace Výchozí hodnota Popis
spark.sql.parquet.vorder.default pravda Řídí zápis na úrovni relace V-Order.
TBLPROPERTIES("delta.parquet.vorder.default") nepravda Výchozí režim V-Order u tabulek
Možnost zapisovače datového rámce: parquet.vorder.default nenastavený Řízení zápisů ve formátu V-Order pomocí zapisovače DataFrame

Pomocí následujících příkazů můžete řídit použití zápisů V-Order.

Kontrola konfigurace V-Order v rámci relace Apache Spark

%%sql 
SET spark.sql.parquet.vorder.default 

Zakázat zápis ve formátu V-Order v relaci Apache Spark

%%sql 
SET spark.sql.parquet.vorder.default=FALSE 

Povolení zápisu V-Order v rámci relace Apache Spark

Důležité

Pokud je tato možnost povolená na úrovni relace. Všechny zápisy do formátu Parquet jsou prováděny s povoleným režimem V-Order. Toto zahrnuje tabulky v ne-Delta formátu parquet a Delta tabulky s vlastností tabulky nastavenou na parquet.vorder.default, která je buď true nebo false.

%%sql 
SET spark.sql.parquet.vorder.default=TRUE 

Řízení pořadí V-Order pomocí vlastností tabulky Delta

Při vytváření tabulky povolte vlastnost tabulky V-Order:

%%sql 
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.default" = "true");

Důležité

Pokud je vlastnost tabulky nastavena na true, příkazy INSERT, UPDATE a MERGE se budou chovat podle očekávání a provádět optimalizaci doby zápisu. Pokud je konfigurace relace V-Order nastavena na "true" nebo ji povoluje spark.write, pak zápisy budou prováděny jako V-Order, i když je TBLPROPERTIES nastavena na "false".

Povolte nebo zakažte V-Order změnou vlastnosti tabulky.

%%sql 
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.default" = "true");

ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.default" = "false");

ALTER TABLE person UNSET TBLPROPERTIES("delta.parquet.vorder.default");

Po povolení nebo zakázání pořadí V-Order pomocí vlastností tabulky budou ovlivněny pouze budoucí zápisy do tabulky. Soubory Parquet udržují řazení použité při vytváření. Pokud chcete změnit aktuální fyzickou strukturu tak, aby se aplikoval nebo odstranil V-Order, přečtěte si níže část Řízení V-Order, když optimalizujete tabulku.

Řízení pořadí V přímo při operacích zápisu

Všechny příkazy pro zápis Apache Spark dědí nastavení relace, pokud nejsou explicitní. Všechny následující příkazy zapisují s využitím V-Order, přičemž implicitně z dědí konfiguraci relace.

df_source.write\
  .format("delta")\
  .mode("append")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .location("Files/people")\
  .execute()

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
  .saveAsTable("myschema.mytable") 

Důležité

Pořadí V se vztahuje pouze na soubory ovlivněné predikátem.

V relaci, ve které není spark.sql.parquet.vorder.default nastaven nebo je nastaven na hodnotu false, by následující příkazy zapisovaly pomocí pořadí V:

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
  .option("parquet.vorder.default ","true")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .option("parquet.vorder.default","true")\
  .location("Files/people")\
  .execute()

Co je 'Optimize Write'?

Analytické úlohy na strojích pro zpracování velkých objemů dat, jako je Apache Spark, fungují nejefektivněji při použití standardizovaných větších velikostí souborů. Vztah mezi velikostí souboru, počtem souborů, počtem pracovních procesů Sparku a jeho konfigurací hraje důležitou roli při výkonu. Ingestování dat do tabulek Data Lake může mít zděděnou charakteristiku neustálého zápisu velkého množství malých souborů; tento scénář se běžně označuje jako "malý problém se souborem".

Optimalizace zápisu je funkce Delta Lake v Microsoft Fabric a Azure Synapse Analytics v modulu Apache Spark, která snižuje počet zapsaných souborů a má za cíl zvýšit velikost jednotlivých souborů zapsaných dat. Cílovou velikost souboru je možné změnit podle požadavků na úlohy pomocí konfigurací.

Tato funkce je ve výchozím nastavení povolená v prostředí Microsoft Fabric Runtime pro Apache Spark. Další informace o scénářích optimalizace využití zápisu najdete v článku Potřeba optimalizace zápisu v Apache Sparku.

Optimalizace sloučení

Příkaz Delta Lake MERGE umožňuje uživatelům aktualizovat tabulku Delta s rozšířenými podmínkami. Pomocí příkazu MERGE může aktualizovat data ze zdrojové tabulky, zobrazení nebo datového rámce do cílové tabulky. Aktuální algoritmus v opensourcové distribuci Delta Lake ale není plně optimalizovaný pro zpracování nemodifikovaných řádků. Tým Microsoft Spark Delta implementoval vlastní optimalizaci spojení s nízkým náhodným uspořádáním, přičemž neupravené řádky jsou vyloučeny z nákladné operace prohazování, která je nutná pro aktualizaci odpovídajících řádků.

Implementace je řízena spark.microsoft.delta.merge.lowShuffle.enabled konfigurací, která je ve výchozím nastavení povolena v modulu runtime. Nevyžaduje žádné změny kódu a je plně kompatibilní s opensourcovou distribucí Delta Lake. Další informace o scénářích použití nízkého prohazování najdete v článku Optimalizace nízkého prohazování v tabulkách Delta.

Údržba tabulek Delta

Vzhledem k tomu, že se tabulky Delta mění, efektivita výkonu a nákladů na úložiště má tendenci se snižovat z následujících důvodů:

  • Nová data přidaná do tabulky můžou zkreslit data.
  • Dávkové a streamované rychlosti příjmu dat můžou přinést mnoho malých souborů.
  • Operace aktualizace a odstranění nakonec vytvářejí zátěž při čtení; soubory parquet jsou svým návrhem neměnné, takže tabulky Delta přidávají nové soubory parquet se sadou změn, což dále zesiluje problémy způsobené prvními dvěma faktory.
  • Už nepotřebujete datové soubory a soubory protokolů dostupné v úložišti.

Pro dosažení nejlepšího výkonu udržujte tabulky v nejlepším stavu provedením komprimace a vákuování v tabulkách Delta. Komprimace úložiště se dosahuje příkazem OPTIMIZE; všechny změny slučuje do větších konsolidovaných souborů parquet. Čištění dereferencované paměti je dosaženo příkazem VACUUM.

Příkazy údržby tabulek OPTIMIZE a VACUUM je možné použít v poznámkových blocích a definicích úloh Sparku a pak je orchestrovat pomocí funkcí platformy. Lakehouse in Fabric nabízí funkci pro použití uživatelského rozhraní k provádění ad hoc údržby tabulek, jak je vysvětleno v článku o údržbě tabulky Delta Lake.

Důležité

Správné navrhování fyzické struktury tabulky na základě frekvence příjmu dat a očekávaných vzorů čtení je pravděpodobně důležitější než spouštění příkazů optimalizace popsaných v této části.

Řízení pořadí V při optimalizaci tabulky

Následující příkazy strukturují bin-compact a přepisují všechny ovlivněné soubory pomocí V-Order, nezávisle na nastavení TBLPROPERTIES nebo nastavení konfigurace relace:

%%sql 
OPTIMIZE <table|fileOrFolderPath> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> [ZORDER  BY (col_name1, col_name2, ...)] VORDER;

Při společném použití ZORDER a VORDER provede Apache Spark sekvenčně binární kompakci, ZORDER a VORDER.

Následující příkazy komprimují a přepíší všechny ovlivněné soubory pomocí nastavení TBLPROPERTIES. Pokud je TBLPROPERTIES nastavena true na V-Order, všechny ovlivněné soubory jsou zapsány jako V-Order. Pokud nejsou TBLPROPERTIES nastaveny nebo jsou nastaveny na hodnotu false pro V-Order, dědí nastavení relace; takže pokud chcete odstranit V-Order z tabulky, nastavte konfiguraci relace na false.

%%sql 
OPTIMIZE <table|fileOrFolderPath>;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate [ZORDER BY (col_name1, col_name2, ...)];