Share via


De noodzaak voor het optimaliseren van schrijfbewerkingen in Apache Spark

Analytische workloads op big data-verwerkingsengines zoals Apache Spark presteren het meest efficiënt wanneer u gestandaardiseerde grotere bestandsgrootten gebruikt. De relatie tussen de bestandsgrootte, het aantal bestanden, het aantal Spark-werkrollen en de configuraties, speelt een belangrijke rol bij de prestaties. Opnameworkloads in Data Lake-tabellen kunnen het overgenomen kenmerk hebben van het voortdurend schrijven van veel kleine bestanden; dit scenario wordt meestal het 'probleem met kleine bestanden' genoemd.

Write optimaliseren is een Delta Lake op Synapse-functie waarmee het aantal geschreven bestanden wordt verminderd en is gericht op het vergroten van de afzonderlijke bestandsgrootte van de geschreven gegevens. Het optimaliseert partities dynamisch tijdens het genereren van bestanden met een standaardgrootte van 128 MB. De grootte van het doelbestand kan worden gewijzigd per workload met behulp van configuraties.

Met deze functie wordt de bestandsgrootte bereikt met behulp van een extra fase voor het verdelen van gegevens over partities, wat een extra verwerkingskosten veroorzaakt tijdens het schrijven van de gegevens. De kleine schrijfstraf moet worden meegewegen door leesefficiëntie in de tabellen.

Notitie

  • Het is beschikbaar in Synapse-pools voor Apache Spark-versies boven 3.1.

Voordelen van schrijfbewerkingen optimaliseren

  • Deze is beschikbaar in Delta Lake-tabellen voor schrijfpatronen voor batch- en streaming-schrijfpatronen.
  • U hoeft het spark.write opdrachtpatroon niet te wijzigen. De functie wordt ingeschakeld door een configuratie-instelling of een tabeleigenschap.
  • Het vermindert het aantal schrijftransacties in vergelijking met de opdracht OPTIMIZE.
  • OPTIMIZE-bewerkingen zijn sneller, omdat deze op minder bestanden werken.
  • Vacuum-opdracht voor het verwijderen van oude niet-deductiebestanden werkt ook sneller.
  • Query's scannen minder bestanden met optimale bestandsgrootten, waardoor de leesprestaties of het resourcegebruik worden verbeterd.

Scenario's voor schrijfgebruik optimaliseren

Wanneer te gebruiken

  • Gepartitioneerde Delta Lake-tabellen zijn onderhevig aan schrijfpatronen die suboptimaal genereren (minder dan 128 MB) of niet-gestandaardiseerde bestandsgrootten (bestanden met verschillende grootten tussen zichzelf).
  • Gepartitioneerde gegevensframes die naar schijf worden geschreven met suboptimale bestandengrootte.
  • Gepartitioneerde Delta Lake-tabellen waarop kleine batch-SQL-opdrachten worden uitgevoerd, zoals UPDATE, DELETE, MERGE, CREATE TABLE AS SELECT, INSERT INTO, enzovoort.
  • Scenario's voor streamingopname met gegevenspatronen toevoegen aan gepartitioneerde Delta Lake-tabellen waarbij de extra schrijflatentie acceptabel is.

Wanneer moet u dit vermijden

  • Niet-gepartitioneerde tabellen.
  • Gebruiksvoorbeelden waarbij extra schrijflatentie niet acceptabel is.
  • Grote tabellen met goed gedefinieerde optimalisatieschema's en leespatronen.

De functie voor het optimaliseren van schrijfbewerkingen in- en uitschakelen

De functie voor het optimaliseren van schrijfbewerkingen is standaard uitgeschakeld. In Spark 3.3-pool is deze standaard ingeschakeld voor gepartitioneerde tabellen.

Zodra de configuratie is ingesteld voor de pool of sessie, gebruiken alle Spark-schrijfpatronen de functionaliteit.

Als u de functie voor het optimaliseren van schrijfbewerkingen wilt gebruiken, schakelt u deze in met behulp van de volgende configuratie:

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

Als u de huidige configuratiewaarde wilt controleren, gebruikt u de opdracht zoals hieronder wordt weergegeven:

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

Als u de functie voor het optimaliseren van schrijfbewerkingen wilt uitschakelen, wijzigt u de volgende configuratie, zoals hieronder wordt weergegeven:

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

Schrijf optimaliseren beheren met behulp van tabeleigenschappen

In nieuwe tabellen

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

De DeltaTableBuilder-API gebruiken:

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

Op bestaande tabellen

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

De DeltaTableBuilder-API gebruiken

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

De huidige configuratie voor maximale bestandsgrootte voor Schrijven optimaliseren ophalen en wijzigen

Gebruik de belgopdrachten om de huidige configuratiewaarde op te halen. De standaardwaarde is 128 MB.

  1. Scala en PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.binSize")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize`
  • De configuratiewaarde wijzigen
  1. Scala en PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.binSize", "134217728")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize` = 134217728

Volgende stappen