Optimalisatie van lage shuffle-samenvoeging op Delta-tabellen
Met de opdracht Delta Lake MERGE kunnen gebruikers een deltatabel bijwerken met geavanceerde voorwaarden. Het kan gegevens uit een brontabel, weergave of DataFrame in een doeltabel bijwerken met behulp van de opdracht MERGE. Het huidige algoritme is echter niet volledig geoptimaliseerd voor het verwerken van ongewijzigde rijen. Met optimalisatie van lage shuffle-samenvoeging worden ongewijzigde rijen uitgesloten van een dure shuffling-bewerking die nodig is voor het bijwerken van overeenkomende rijen.
Waarom we lage shuffle-samenvoeging nodig hebben
De samenvoegbewerking wordt momenteel uitgevoerd door twee join-uitvoeringen. De eerste join maakt gebruik van de hele doeltabel en brongegevens om een lijst met aangeraakte bestanden van de doeltabel te vinden, inclusief overeenkomende rijen. Daarna wordt de tweede join uitgevoerd die alleen de aangeraakte bestanden en brongegevens leest om de werkelijke tabelupdate uit te voeren. Hoewel de eerste join is om de hoeveelheid gegevens voor de tweede join te verminderen, kan er nog steeds een groot aantal ongewijzigde rijen in aangeraakte bestanden zijn. De eerste joinquery is lichter omdat alleen kolommen in de opgegeven overeenkomende voorwaarde worden gelezen. De tweede voor het bijwerken van tabellen moet alle kolommen laden, waardoor er een duur shufflingproces optreedt.
Met optimalisatie van low shuffle-samenvoeging behoudt Delta het overeenkomende rijresultaat van de eerste join tijdelijk en gebruikt deze voor de tweede join. Op basis van het resultaat worden ongewijzigde rijen uitgesloten van het zware shuffling-proces. Er zijn twee afzonderlijke schrijftaken voor overeenkomende rijen en ongewijzigde rijen, waardoor het kan leiden tot 2x aantal uitvoerbestanden in vergelijking met het vorige gedrag. De verwachte prestatiewinst weegt echter op tegen het mogelijke probleem met kleine bestanden.
Beschikbaarheid
Notitie
- Low Shuffle Merge is beschikbaar als preview-functie.
Deze is beschikbaar in Synapse-pools voor Apache Spark-versies 3.2 en 3.3.
Versie | Beschikbaarheid | Standaardinstelling |
---|---|---|
Delta 0.6 / Spark 2.4 | Nee | - |
Delta 1.2 / Spark 3.2 | Ja | false |
Delta 2.2 / Spark 3.3 | Ja | true |
Voordelen van samenvoegen met lage willekeurige volgorde
- Niet-gewijzigde rijen in aangeraakte bestanden worden afzonderlijk verwerkt en worden niet door de werkelijke SAMENVOEGbewerking uitgevoerd. Hiermee kunt u de totale uitvoeringstijd voor SAMENVOEGEN en rekenresources besparen. De winst zou groter zijn wanneer veel rijen worden gekopieerd en slechts een paar rijen worden bijgewerkt.
- Rijvolgordes blijven behouden voor ongewijzigde rijen. Daarom kunnen de uitvoerbestanden van ongewijzigde rijen nog steeds efficiƫnt zijn voor het overslaan van gegevens als het bestand is gesorteerd of Z-ORDER.
- Er zou een kleine overhead zijn, zelfs voor het ergste geval wanneer de samenvoegvoorwaarde overeenkomt met alle rijen in aangeraakte bestanden.
Samenvoegen met lage willekeurige volgorde in- en uitschakelen
Zodra de configuratie is ingesteld voor de pool of sessie, gebruiken alle Spark-schrijfpatronen de functionaliteit.
Als u optimalisatie voor samenvoegen met lage willekeurige volgorde wilt gebruiken, schakelt u deze in met behulp van de volgende configuratie:
- Scala en PySpark
spark.conf.set("spark.microsoft.delta.merge.lowShuffle.enabled", "true")
- Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled` = true
Als u de huidige configuratiewaarde wilt controleren, gebruikt u de opdracht zoals hieronder wordt weergegeven:
- Scala en PySpark
spark.conf.get("spark.microsoft.delta.merge.lowShuffle.enabled")
- Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled`
Als u de functie wilt uitschakelen, wijzigt u de volgende configuratie, zoals hieronder wordt weergegeven:
- Scala en PySpark
spark.conf.set("spark.microsoft.delta.merge.lowShuffle.enabled", "false")
- Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled` = false