Eenvoudige, efficiënte en gegevenspijplijnen met lage latentie bouwen
De huidige gegevensgestuurde bedrijven produceren continu gegevens, wat technische gegevenspijplijnen vereist die deze gegevens continu opnemen en transformeren. Deze pijplijnen moeten gegevens exact één keer kunnen verwerken en leveren, resultaten produceren met latenties van minder dan 200 milliseconden en altijd proberen de kosten te minimaliseren.
In dit artikel worden methoden voor batch- en incrementele stroomverwerking beschreven voor engineeringgegevenspijplijnen, waarom incrementele stroomverwerking de betere optie is en volgende stappen voor het aan de slag gaan met incrementele gegevensstroomverwerkingsaanbiedingen van Databricks, Streamen op Azure Databricks en Wat is DLT?. Met deze functies kunt u snel pijplijnen schrijven en uitvoeren die semantiek, latentie, kosten en meer garanderen.
De valkuilen van repetitieve batchtaken
Bij het instellen van uw gegevenspijplijn kunt u in eerste instantie herhaalde batchopdrachten schrijven om uw gegevens te verwerken. U kunt bijvoorbeeld elk uur een Spark-taak uitvoeren die uit uw bron leest en gegevens naar een sink schrijft, zoals Delta Lake. De uitdaging van deze aanpak is het incrementeel verwerken van uw bron, omdat de Spark-taak die elk uur wordt uitgevoerd moet beginnen waar de laatste is geëindigd. U kunt de meest recente tijdstempel opnemen van de gegevens die u hebt verwerkt en vervolgens alle rijen met tijdstempels selecteren die recenter zijn dan die tijdstempel, maar er zijn valkuilen:
Als u een pijplijn voor doorlopende gegevens wilt uitvoeren, kunt u proberen een batchtaak per uur in te plannen die incrementeel uit uw bron leest, transformaties uitvoert en het resultaat naar een opslag schrijft, zoals Delta Lake. Deze aanpak kan valkuilen hebben:
- Een Spark-taak die na een tijdstempel alle nieuwe gegevens opvraagt, mist late gegevens.
- Een Spark-taak die mislukt, kan leiden tot het verbreken van exact eenmaal gegarandeerde garanties, als deze niet zorgvuldig worden afgehandeld.
- Een Spark-taak waarin de inhoud van cloudopslaglocaties wordt vermeld om nieuwe bestanden te vinden, wordt duur.
Vervolgens moet u deze gegevens nog steeds herhaaldelijk transformeren. U kunt herhaalde batchtaken schrijven die vervolgens uw gegevens aggregeren of andere bewerkingen toepassen, wat de efficiëntie van de pijplijn verder bemoeilijkt en vermindert.
Een voorbeeld van een batch
Bekijk de volgende voorbeelden om de valkuilen van batchopname en -transformatie voor uw pijplijn volledig te begrijpen.
Gemiste gegevens
Gezien een Kafka-onderwerp met gebruiksgegevens waarmee wordt bepaald hoeveel kosten uw klanten in rekening worden gebracht en uw pijplijn in batches opneemt, kan de volgorde van gebeurtenissen er als volgt uitzien:
- Uw eerste batch heeft twee records om 8:00 uur en 8:30 uur.
- U werkt de laatste tijdstempel bij naar 8:30 uur.
- U krijgt nog een opname om 8:15 uur.
- Uw tweede batchquery's voor alles na 8:30 uur, zodat u de record om 8:15mist.
Bovendien wilt u uw gebruikers niet te veel op- of ontladen, zodat u ervoor moet zorgen dat u elke record precies één keer opneemt.
Redundante verwerking
Stel dat uw gegevens rijen met gebruikersaankopen bevatten en u de verkoop per uur wilt aggregeren, zodat u de populairste tijden in uw winkel kent. Als aankopen voor hetzelfde uur in verschillende batches binnenkomen, hebt u meerdere batches die uitvoer produceren voor hetzelfde uur:
Batch-opname voorbeeld
Heeft het venster 8:00 tot 9:00 uur twee elementen (de uitvoer van batch 1), één element (de uitvoer van batch 2) of drie (de uitvoer van geen van de batches)? De gegevens die nodig zijn om een bepaald tijdvenster te produceren, worden weergegeven in meerdere batches van transformatie. U kunt dit oplossen door uw gegevens per dag te partitioneren en de hele partitie opnieuw te verwerken wanneer u een resultaat moet berekenen. Vervolgens kunt u de resultaten in uw sink overschrijven:
Dit gaat echter ten koste van latentie en kosten, omdat de tweede batch het onnodige werk moet doen van het verwerken van gegevens die het mogelijk al heeft verwerkt.
Geen valkuilen met incrementele stroomverwerking
Met incrementele stroomverwerking kunt u eenvoudig alle valkuilen van herhaalde batchtaken vermijden om gegevens op te nemen en te transformeren. Databricks Structured Streaming en DLT implementatiecomplexiteiten van streaming beheren, zodat u zich kunt richten op alleen uw bedrijfslogica. U hoeft alleen op te geven met welke bron verbinding moet worden gemaakt, met welke transformaties de gegevens moeten worden uitgevoerd en waar het resultaat moet worden geschreven.
Stapsgewijze opname
Incrementele opname in Databricks wordt mogelijk gemaakt door Apache Spark Structured Streaming, waardoor incrementeel een gegevensbron kan worden verbruikt en naar een sink kan worden geschreven. De Structured Streaming-engine kan gegevens precies één keer consumeren en de engine kan out-of-order gegevens verwerken. De engine kan worden uitgevoerd in notebooks of met behulp van streamingtabellen in DLT.
De structured streaming-engine op Databricks biedt eigen streamingbronnen, zoals AutoLoader, waarmee cloudbestanden stapsgewijs op een rendabele manier kunnen worden verwerkt. Databricks biedt ook connectors voor andere populaire berichtbussen zoals Apache Kafka, Amazon Kinesis, Apache Pulsaren Google Pub/Sub.
Incrementele transformatie
Met incrementele transformatie in Databricks met Structured Streaming kunt u transformaties naar DataFrames opgeven met dezelfde API als een batchquery, maar hiermee worden gegevens in batches en geaggregeerde waarden in de loop van de tijd bijgehouden, zodat u dat niet hoeft te doen. Het hoeft nooit gegevens opnieuw te verwerken, dus het is sneller en rendabeler dan herhaalde batchtaken. Structured Streaming produceert een stroom met gegevens die kunnen worden toegevoegd aan uw sink, zoals Delta Lake, Kafka of een andere ondersteunde connector.
Materialized Views in DLT worden aangedreven door de Enzyme-engine. Het enzym verwerkt uw bron nog steeds incrementeel, maar in plaats van een stroom te produceren, wordt er een gerealiseerde weergavegemaakt. Dit is een vooraf berekende tabel waarin de resultaten van een query worden opgeslagen die u geeft. Enzym kan efficiënt bepalen hoe nieuwe gegevens van invloed zijn op de resultaten van uw query en houdt de vooraf berekende tabel up-to-datum bij.
Gerealiseerde weergaven maken een weergave van uw aggregaties die altijd efficiënt worden bijgewerkt, zodat u in het bovenstaande scenario bijvoorbeeld weet dat het venster van 8:00 tot 9:00 uur drie elementen bevat.
Gestructureerd streamen of DLT?
Het belangrijke verschil tussen Structured Streaming en DLT is de manier waarop u uw streamingquery's operationeel maakt. In Structured Streaming geeft u handmatig veel configuraties op en moet u query's handmatig samenvoegen. U moet expliciet queries starten, wachten tot ze zijn voltooid, ze annuleren bij fouten, en andere acties ondernemen. Bij DLT geef je je pijplijnen declaratief aan DLT om uit te voeren, en het zorgt ervoor dat ze blijven draaien.
DLT heeft ook functies zoals gematerialiseerde weergaven, die efficiënt en incrementeel transformaties van uw gegevens voorberekenen.
Zie Streaming op Azure Databricks en Wat is DLT voor meer informatie over deze functies?.
Volgende stappen
- Maak uw eerste pijplijn met DLT. Zie Handleiding: Voer uw eerste DLT-pijplijn uit.
- Voer uw eerste Structured Streaming-query's uit op Databricks. Zie uw eerste Structured Streaming Workload uitvoeren.
- Gebruik een gematerialiseerde weergave. Zie Gerealiseerde weergaven gebruiken in Databricks SQL.