Datapijplijn implementeren: Toepassen van het datapijplijn-concept

Deze handleiding bouwt voort op het ‘ELT, ETL en datapijplijnen’- artikel, waarin veelvoorkomende problemen van bedrijven bij het opslaan en gebruik van data worden besproken. Als antwoord op deze en meer problemen introduceerde Don – Data Scientist en Data Engineer bij Young Mavericks – het concept ‘datapijplijnen’, waarmee bedrijven een datagedreven cultuur kunnen creëren en zo optimaal mogelijk hun data kunnen inladen – en welke tools hiervan handig zijn. In dit artikel past Don de eerder behandelde concepten achter datapijplijnen toe bij het daadwerkelijk implementeren van een werkende datapijplijn. De complete code is te vinden op onze Gitlab.

Voorbereiding

Zoals gebruikelijk binnen de wereld van Data Engineering volgen we bij het implementeren van concepten een stappenplan, specifieke methoden en een strategie. Bij het voorbereiden van de implementatie is er allereerst een databron nodig die – in real-time – gegevens genereert die ook periodiek kunnen worden opgevraagd. Als voorbeeld nemen we in deze blog twitterdata, en dan specifiek de trending tweets uit Nederland. Hiervoor hebben we een Twitter Developer-account aangemaakt en de benodigde toegangstokens gegenereerd. Verder maken we gebruik van de volgende tools:

● Python 3.8

● Docker

● Docker Compose

Stappenplan datapijplijn – Data uit de bron importeren

Stap 1: Toegang tot de databron

Voordat we daadwerkelijk gaan bouwen is het belangrijk om toegang te hebben tot de databron én hier data uit te kunnen opvragen. Na toestemming te hebben gekregen voor het aanmaken van een Twitter Developer-account, was het belangrijk om de benodigde authenticatietokens te genereren met een andere applicatie. Controleer bij deze eerste stap of de databron aan te roepen is via een API of dat er een extract van de data periodiek wordt gedeeld via een fileshare service

Stap 2: API authentiseren

Voordat we de API of de fileshare service kunnen gebruiken, moet je jezelf eerst ‘autoriseren’. Welk authenticatieproces bij jou van toepassing is hangt af van welke dienst je gebruik wilt maken. 

Voor de Twitter API geef je de volgende vier tokens op:

In dit voorbeeld maken we gebruik van het Python-pakket ‘Tweepy’ om de Twitter API aan te roepen. De autorisatie ziet er als volgt uit:

Stap 3: gegevens extraheren

Nu je toegang hebt tot de databron (via een API of data-extract) kun je de data gaan importeren. Hiervoor roep je API aan en vraag je de benodigde gegevens op, die API vervolgens terugstuurt. In deze stap kan het daarnaast handig zijn om al enkele datatransformaties uit te voeren: denk hierbij aan het verwijderen of transformeren van privacygevoelige gegevens, of het uitsluiten van data waarvan je zeker weet dat je die nooit gaat gebruiken. 
Om de gegevens te extraheren selecteren we de trendingtopics op Twitter en de bijbehorende top 10 tweets. Op deze data voeren we enkele transformaties uit zodat we enkel de Twitterteksten opslaan.

Stap 4: Gegevens inladen

Met de benodigde data in bezit kun je deze nu in de meest ruwe vorm opslaan. Vergeet hierbij niet dat de opslagmethode afhangt van welke opslagdienst je gebruikt. 

Opslagdiensten kunnen ruwweg worden onderverdeeld in vier soorten. Het eerste type is een Data Lake waar de gegevens in verschillende bestandvormen worden opgeslagen, waaronder JSON, CSV, SQL en TXT. Deze opslagwijze is meestal het minst prijzig en wordt vaak gebruikt om gegevens in hun meest ruwe vorm op te slaan en/of als back-uplocatie. Het tweede opslagtype is een SQL-database, waarin de data in een gestructureerde tabelvorm volgens een vooraf gedefinieerd tabelschema wordt opgeslagen. De SQL-opslagmethode is doorgaans duurder en is het vooral geschikt om gegevens in hun meest ‘schone’ vorm beschikbaar te stellen voor analyse. Het derde type is de NoSQL-database, waarbij de gegevens semigestructureerd worden opgeslagen in een key-value-formaat. Deze vorm zit qua kosten gemiddeld gesproken tussen een Data Lake en een SQL-database in en wordt gebruikt om ongestructureerde gegevens – zoals tweets – op te slaan in een gestandaardiseerd formaat. Het vierde en laatste opslagtype is een Graph-database, waarin de data wordt opgeslagen met relaties tussen de verschillende datapunten. Dit type opslag is vaak een duurdere optie en wordt gebruikt om complexere inzichten uit de gegevens te genereren. 

We gaan verder met het inladen van de Twittergegevens en bewaren de data op hetzelfde apparaat als waarop we de code uitvoeren – in JSON-bestanden. 

De keuze voor het JSON-formaat komt voort uit het feit dat de tweets semigestructureerde datapunten zijn. Tweets kunnen namelijk URLS, afbeeldingen, tekst, emoji’s en hashtags bevatten. Met JSON kan de data in een leesbaar schema worden opgeslagen. Veelgebruikte alternatieven hiervoor zijn CSV, XLSX en YAML. Het nadeel van CSV en XLSX is dat diens schema’s minder flexibel zijn dan die van JSON, omdat deze een vast scheidingsteken gebruiken om de kolommen van elkaar te scheiden. Deze scheidingstekens (separators) kunnen ook in de tweets zelf voorkomen, wat het opslagproces onnodig complex maakt. YAML en JSON zijn vrijwel identiek, met het grootste verschil dat YAML voor gebruikers iets beter leesbaar is dan JSON. 
Inmiddels hebben we een lokaal Data Lake gecreëerd. Om het overzicht over alle data in het Data Lake te behouden is het aan te raden een index bij te houden. Hiervoor kun je de naam van de data als sleutel, en de locatie van het JSON-bestand als waarde gebruiken:

Stap 5: Data versioning toepassen

Nu we de data hebben opgeslagen, is het tijd om data versioning toe te passen. Om optimaal gebruik te kunnen maken van data versioning, is het belangrijk om elke verandering in de dataopslag mee te nemen in de versioning. Hiervoor kun je de DVC-tool gebruiken. 

Voordat we de DVC-tool toepassen moet deze allereerst worden geïnitieerd op de nieuwe data:

Vergeet niet na elke datawijziging de data opnieuw te runnen.

Gegevens gebruiken om inzichten te genereren

Stap 6: Gewenste data inladen  

In deze stap gaan we de data die we willen gebruiken om inzichten te genereren uit onze eigen opslag halen. De voorgaande vijf stappen zijn alleen van toepassing indien er een nieuwe databron moet worden toegevoegd; is dit niet het geval, kun je stap zes als eerste stap beschouwen. 
De opgeslagen data kunnen we nu gebruiken om inzichten te creëren. In het voorbeeld gebruiken we de meest recente trending tweets-set die in onze dataopslag staat.

Stap 7: Tweets transformeren

In deze stap passen we een paar transformatiestappen toe op de data, zodat we er inzichten uit kunnen genereren. Denk hierbij aan het combineren van verschillende databronnen of het omzetten van de data naar een beter formaat voor het verwerven van inzichten.  

Vaak gaat hieraan een verkenningsstap vooraf, zodat bepaald kan worden wat de juiste transformatiestappen zijn, welke inzichten er uit de data gehaald kunnen worden en welke data de grootste toegevoegde waarde heeft. Voor het doel van deze blog – het toepassen van het datapijplijnconcept – is dit minder relevant en zal nu dus verder niet aan bod komen. 

Hieronder zie je hoe we een paar transformaties hebben uitgevoerd op de Twitterdata, zodat enkel de trefwoorden van elke tweet overblijven.

Stap 8: Inzichten genereren

In deze voorlaatste stap gebruiken we de getransformeerde data uit stap 7 om inzichten te genereren. Er zijn talloze manieren om data-inzichten te genereren; de optimale wijze hangt af van de eindgebruikers en je uiteindelijke doel. 
Nu passen we topic modeling toe op de getransformeerde tweets. Met topic modeling worden samenhangende trefwoorden gegroepeerd in Topics, die op hun beurt de kernonderwerpen van alle tweets vormen.

De code periodiek uitvoeren

Stap 9: code toevoegen aan een Scheduler

Nu we een volledige versie van de datapijplijn hebben geschreven én getest, is het tijd om de pijplijn toe te voegen aan een Scheduler. Hiermee zorg je ervoor dat de code automatisch wordt uitgevoerd volgens een door jou opgegeven tijdschema. Voor het voorbeeld maken we gebruik van het Python-pakket Prefect, omdat deze intuïtief werkt, gebruiksvriendelijk is en helpt de code leesbaar te maken.

Nu plannen we de stappen in de Schedular om de trending tweets uit Twitter te importeren en zo de volledige datapijplijn te definiëren.

Vervolgens voegen we een schema toe waarmee wordt bepaald wanneer de datapijplijn moet worden uitgevoerd.

Tot slot starten we de Schedular.

Super! Je hebt nu een werkende datapijplijn geïmplementeerd.

ELT, ETL en datapijplijnen: do it yourself geautomatiseerd data inladen

Mijn naam is Don en in mijn werk voor Young Mavericks combineer ik mijn kennis als Data Engineer met mijn expertise in Data Science. In de praktijk komt dit erop neer dat ik repetitieve taken automatiseer, inzichten uit data genereer en een coördinerende en adviserende rol heb binnen projecten. Ik geniet het meest van het creatieve proces dat nodig is om problemen op te lossen met behulp van data.

Lees meer

Datapijplijn implementeren: Toepassen van het datapijplijn-concept

Deze handleiding bouwt voort op het ‘ELT, ETL en datapijplijnen’- artikel, waarin veelvoorkomende problemen van bedrijven bij het opslaan en gebruik van data worden besproken. Als antwoord op deze en meer problemen introduceerde Don – Data Scientist en Data Engineer bij Young Mavericks – het concept ‘datapijplijnen’, waarmee bedrijven een datagedreven cultuur kunnen creëren en zo optimaal mogelijk hun data kunnen inladen – en welke tools hiervan handig zijn. In dit artikel past Don de eerder behandelde concepten achter datapijplijnen toe bij het daadwerkelijk implementeren van een werkende datapijplijn. De complete code is te vinden op onze Gitlab.

Lees meer