Az Apache Sparkon való írás optimalizálásának szükségessége

A Big Data-feldolgozó motorokon, például az Apache Sparkon végzett elemzési számítási feladatok a leghatékonyabban teljesítenek a szabványosított nagyobb fájlméretek használatakor. A fájlméret, a fájlok száma, a Spark-feldolgozók száma és konfigurációi közötti kapcsolat kritikus szerepet játszik a teljesítményben. A data lake-táblákba való betöltési számítási feladatok örökölt jellemzője lehet, hogy folyamatosan sok kis fájlt írnak; ezt a forgatókönyvet gyakran "kis fájlproblémának" is nevezik.

Az Írás optimalizálása egy Delta Lake on Synapse szolgáltatás, amely csökkenti az írott fájlok számát, és célja az írott adatok egyedi fájlméretének növelése. Dinamikusan optimalizálja a partíciókat, miközben alapértelmezett 128 MB méretű fájlokat hoz létre. A célfájl mérete számítási feladatonként konfigurációk használatával módosítható.

Ez a funkció a partíciókhoz való további adatelkeverési fázissal éri el a fájlméretet, ami további feldolgozási költséget okoz az adatok írása során. A kis írási büntetést a táblák olvasási hatékonyságának kell felülmúlnia.

Feljegyzés

  • A 3.1-et meghaladó Apache Spark-verziókhoz készült Synapse-készletekben érhető el.

Az írások optimalizálásának előnyei

  • Delta Lake-táblákon egyaránt elérhető Batch- és Streamelési írási mintákhoz.
  • A parancsmintát spark.write nem kell módosítani. A funkciót konfigurációs beállítás vagy táblatulajdonság engedélyezi.
  • Csökkenti az írási tranzakciók számát az OPTIMIZE paranccsal összehasonlítva.
  • Az OPTIMIZE-műveletek gyorsabbak lesznek, mivel kevesebb fájlon fognak működni.
  • A régi nem hivatkozott fájlok törlésére szolgáló VACUUM parancs is gyorsabban működik.
  • A lekérdezések kevesebb, optimálisabb fájlméretű fájlt vizsgálnak, ami javítja az olvasási teljesítményt vagy az erőforrás-használatot.

Írási használati forgatókönyvek optimalizálása

Mikor lehet használni

  • A Delta Lake particionált táblák írási mintái nem optimális (128 MB-nál kisebb) vagy nem szabványosított fájlméreteket hoznak létre (egymástól eltérő méretű fájlok).
  • Újraparticionált adatkeretek, amelyeket a rendszer a nem optimális méretű lemezre ír.
  • Delta Lake particionált táblák, amelyeket kis kötegelt SQL-parancsok, például UPDATE, DELETE, MERGE, CREATE TABLE AS Standard kiadás LECT, IN Standard kiadás RT INTO stb.
  • Streamelési forgatókönyvek adatminták hozzáfűzése a Delta Lake particionált tábláihoz, ahol a további írási késés elviselhető.

Mikor kerüljük el?

  • Nem particionált táblák.
  • Olyan eseteket használjon, ahol a többlet írási késés nem elfogadható.
  • Nagy táblák, jól meghatározott optimalizálási ütemezésekkel és olvasási mintákkal.

Az írás optimalizálása funkció engedélyezése és letiltása

Az írás optimalizálása funkció alapértelmezés szerint le van tiltva. A Spark 3.3-készletben alapértelmezés szerint engedélyezve van particionált táblák esetében.

Miután beállította a konfigurációt a készlethez vagy a munkamenethez, minden Spark-írási minta használni fogja a funkciót.

Az optimalizált írási funkció használatához engedélyezze a következő konfigurációval:

  1. Scala és PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "true")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = true

Az aktuális konfigurációs érték ellenőrzéséhez használja az alábbi parancsot:

  1. Scala és PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.enabled")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled`

Az írásoptimalizálási funkció letiltásához módosítsa az alábbi konfigurációt az alábbiak szerint:

  1. Scala és PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "false")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = false

Írás optimalizálásának szabályozása táblázattulajdonságokkal

Új táblákon

  1. SQL
CREATE TABLE <table_name> TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
  1. Scala

A DeltaTableBuilder API használata:

val table = DeltaTable.create()
  .tableName("<table_name>")
  .addColumnn("<colName>", <dataType>)
  .location("<table_location>")
  .property("delta.autoOptimize.optimizeWrite", "true") 
  .execute()

Meglévő táblákon

  1. SQL
ALTER TABLE <table_name> SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
  1. Scala

A DeltaTableBuilder API használata

val table = DeltaTable.replace()
  .tableName("<table_name>")
  .location("<table_location>")
  .property("delta.autoOptimize.optimizeWrite", "true") 
  .execute()

A fájlméret aktuális maximális konfigurációjának lekérése és módosítása az írás optimalizálásához

Az aktuális konfigurációs érték lekéréséhez használja a bellow parancsokat. Az alapértelmezett érték 128 MB.

  1. Scala és PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.binSize")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize`
  • A konfiguráció értékének módosítása
  1. Scala és PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.binSize", "134217728")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize` = 134217728

Következő lépések