Een datapijplijn bouwen met de Stad Gent Parking API, Python, PostgreSQL en Metabase

In deze tutorial laat ik zien hoe ik de Stad Gent Open Data API heb gebruikt om parkeergaragegegevens op te halen met Python, deze op te slaan in een PostgreSQL-database en te visualiseren met Metabase.

Het systeem is ontworpen om te werken op Hetzner Cloud servers met Ubuntu. Mijn achtergrond ligt in business intelligence, dus het bouwen van datapijplijnen en dashboards is wat ik doe voor de kost, maar ik wilde een aantal tools gebruiken die ik niet vaak tegenkom bij mijn huidige klanten om mijn vaardigheden op peil te houden in een snel evoluerende markt. Ik heb de python- en SQL-code en deubuntu commando's weggelaten in de blogpost hieronder om de leesbaarheid te verbeteren. Als je de volledige technische specificaties wilt, kun je ze hier vinden in het Medium-artikel dat ik schreef over dit hobbyproject.

Overzicht van het systeem

  1. Data collectie: Python-scripts halen elke 5 minuten parkeergegevens op uit de API van Stad Gent  en slaan deze op in een PostgreSQL-database.
  2. Data opslag: PostgreSQL-tabellen worden gemaakt om de data op te slaan.
  3. Aggregatie van gegevens: Een script groepeert de data per uur en verwijdert detail data die ouder zijn dan 2 dagen.
  4. Visualisatie: Metabase wordt geïnstalleerd op een aparte server, geconfigureerd om via HTTPS te werken en wordt gebruikt om dashboards te maken om parkeergegevens te visualiseren.

Stap 1: De Hetzner Cloud Servers bestellen

Start twee servers:

  • Server 1: Voor PostgreSQL- en Python-scripts.
  • Server 2: Voor Metabase.
  • Gebruik Ubuntu 22.04 LTS voor beide servers

Ik gebruik hiervoor de kleinste servers van het type CX22. Ze hebben 2 CPU's, 4 GB RAM en een 40 GB SSD voor 3,29€ per maand. Ik maak ook regelmatig snapshots van mijn servers in Hetzner om er zeker van te zijn dat ik een recente versie heb die ik kan herstellen als er iets misgaat. Gelukking, want het was nodig bij het installeren van HTTPS op de Metabase-server.

Waarom twee servers en niet slechts één?

Het gebruik van twee servers in plaats van één is een designkeuze die verschillende voordelen biedt, met name op het gebied van schaalbaarheid, beveiliging en performantie. Het is echter niet strikt noodzakelijk, en je kan absoluut alles op één server draaien als het om een klein project gaat. Laten we eens kijken naar de redenen achter het gebruik van twee servers en wanneer het zinvol zou kunnen zijn om alles op één server te consolideren.

De belangrijkste reden om twee servers te gebruiken is de scheiding van taken. Door PostgreSQL en de Python-scripts op één server te installeren, houd je de dataverwerkings- en opslaglaag geïsoleerd van de visualisatielaag, die wordt afgehandeld door Metabase op de tweede server. Deze scheiding maakt het eenvoudiger om resources te beheren, performantie te optimaliseren en problemen op te lossen. Als Metabase bijvoorbeeld zwaar wordt belast omdat meerdere gebruikers dashboards gebruiken, heeft dit geen invloed op de prestaties van de database of de Python-scripts die gegevens ophalen en verwerken.

Performantie-optimalisatie is een andere belangrijke factor. Zowel PostgreSQL als Metabase kunnen arbeidsintensief zijn. Als u ze op afzonderlijke servers uitvoert, hoeft u zich geen zorgen te maken over CPU, geheugen en schijf-I/O. Dit zorgt ervoor dat de database de gegevensinvoer en -query's efficiënt kan verwerken, terwijl Metabase dashboards kan aanbieden zonder het systeem te vertragen.

Beveiliging is ook een belangrijke overweging. Door Metabase op een aparte server te isoleren, verklein je het aanvalsoppervlak. Als Metabase wordt blootgesteld aan het internet voor toegang tot het dashboard, minimaliseert u het risico van ongeoorloofde toegang tot uw data als u deze geïsoleerd houdt van de databaseserver. U kunt strengere firewallregels configureren voor de databaseserver, zodat alleen toegang vanaf de Metabase-server is toegestaan.

Schaalbaarheid is een ander voordeel van het gebruik van twee servers. Als uw systeem groeit, bijvoorbeeld als u meer gegevensbronnen, gebruikers of complexe vragen toevoegt, kunt u met afzonderlijke servers eenvoudiger horizontaal schalen. U kunt meer resources aan de databaseserver toevoegen als opslag- of queryprestaties een knelpunt worden, of Metabase onafhankelijk schalen als meer gebruikers toegang krijgen tot de dashboards.

Ten slotte zijn onderhoud en updates eenvoudiger met een configuratie met twee servers. Het updaten of herstarten van de ene service, zoals Metabase, heeft geen invloed op de andere, zoals PostgreSQL. Dit is vooral handig tijdens onderhoud of probleemoplossing, omdat u problemen op één server kunt oplossen zonder het hele systeem te onderbreken.

Dat gezegd zijnde, zijn er scenario's waarin het zinvol is om een enkele server te gebruiken. Als uw workload laag is, met kleine hoeveelheden data en weinig gebruikers, kan één server alles probleemloos aan. De kosten zijn een andere factor; als u twee servers gebruikt, verdubbelt u uw infrastructuurkosten, dus als u een beperkt budget hebt, kunt u geld besparen door alles op één server te consolideren. Bovendien is het beheren van een enkele server eenvoudiger dan het beheren van twee servers, omdat u zich geen zorgen hoeft te maken over netwerken, firewalls of communicatie tussen servers.

Als u besluit om één server te gebruiken, kunt u de configuratie aanpassen door alle services (PostgreSQL, Python en Metabase) op dezelfde Ubuntu-server te installeren. Pas de firewallregels aan om toegang tot Metabase vanaf het internet mogelijk te maken en PostgreSQL te beperken tot localhost of specifieke IP-adressen. Houd het gebruik nauwlettend in de gaten om ervoor te zorgen dat de server de gecombineerde werklast aankan. Je kunt ook een reverse proxy zoals nginx gebruiken om HTTPS af te handelen en verkeer naar Metabase te routen, wat de installatie vereenvoudigt.

Kortom, het gebruik van twee servers zorgt voor betere prestaties, beveiliging en schaalbaarheid, maar dit gaat ten koste van meer complexiteit en hogere infrastructuurkosten. Als uw workload laag is of als u net begint, is één enkele server een perfect geldige en kosteneffectieve keuze. Naarmate uw systeem groeit, kunt u later altijd migreren naar een configuratie met twee servers.

Stap 2: PostgreSQL installeren en configureren

1. PostgreSQL installeren

2. Een database en gebruiker aanmaken

3. PgAdmin4 installeren

4. Tabellen maken

U kunt ook tabellen maken vanaf de command line, maar we hebben pgAdmin4 geïnstalleerd om onze databases gemakkelijker te beheren.

Gebruik pgAdmin4 om verbinding te maken met uw PostgreSQL-database en de tabellen te maken die nodig zijn om de data op te slaan die afkomstig zijn van de API.

Stap 3: De python-scripts schrijven

1. Gegevens ophalen uit de Stad Gent API

Vereiste Python-bibliotheken installeren op de databaseserver

pip install psycopg2-binary

2. Python-script om gegevens op te halen en op te slaan

Ik heb uitgebreide logging aan het script toegevoegd om enkele velden te identificeren die niet correct werden opgehaald. Ik besloot om de velden die ik niet makkelijk aan de praat kon krijgen in commentaar te zetten, aangezien ik ze eigenlijk niet nodig had in de context van het dashboard dat ik wilde bouwen.

De gegevens in de API worden elke 5 minuten ververst. Om ervoor te zorgen dat ik de laatste updates ontvang, gebruik ik een cron-job om dit script elke 5 minuten uit te voeren.

Ruimte voor verbetering

Een verbetering zou zijn om erachter te komen waarom sommige velden niet correct worden geladen. Een andere verbetering heeft te maken met de manier waarop ik de scripts inplan. Tijdens het schrijven van deze tutorial kwam ik erachter dat ik misschien ook de Python-bibliotheek Schedule kon gebruiken om het script als een service uit te voeren. Dit is zeker iets waar ik naar zal kijken de volgende keer dat ik zo'n hobbyproject bouw.

3. Aggregatiescript

Om het mogelijk te maken trends in het verleden te analyseren, zonder alle gegevens die elke vijf minuten worden aangemaakt te hoeven bewaren, heb ik de gegevens per uur samengevoegd. Ik heb ook een trend toegevoegd: komen er mensen aan of vertrekken ze?

4. Delete-script

Om ervoor te zorgen dat de server niet te snel vol raakt, bewaar ik alleen de detail data van de laatste 48 uur.

Stap 4: De scripts plannen met cron-jobs

Ik gebruikom deze scripts elke vijf minuten, elk uur en elke dag uit te voeren.

Stap 5: Configureer de Postgres-database om verbindingen vanaf de Metabase-server mogelijk te maken

Voeg het IP-adres 11.22.33.44/32 van de Metabase-server toe aan het pg_hba.conf-bestand op de databaseserver om toegang tot de data mogelijk te maken. Start de postgres-service opnieuw om deze wijziging door te voeren.

Stap 6: Metabase installeren en configureren

1. Metabase installeren

2. HTTPS configureren

3. Converteer het certificaat naar een Java KeyStore (JKS)

4. Metabase als een service uitvoeren

Maak op deze locatie een systemd-servicebestand met behulp van de nano-teksteditor: sudo nano /etc/systemd/system/metabase.service

Nadat je het servicebestand hebt gewijzigd, moet je de configuratie van de systemd manager opnieuw laden om de wijzigingen toe te passen. Vervolgens kunt u de service starten.

Stap 7: Dashboards bouwen in Metabase

1. Metabase koppelen aan PostgreSQL:

2. Stel de url in op HTTPS:

3. Bouw de objecten en visualisaties die je in je dashboard wilt gebruiken:

Bijvoorbeeld de uurtrend:

Met Metabase kun je gegevens op een kaart zetten als je de coördinaten in je gegevens hebt, die we hebben:

Conclusie

Natuurlijk heb ik hier en daar wat details overgeslagen, maar dit zou je een goed begrip moeten geven van wat er nodig is om je eigen Metabase-dashboard te bouwen dat is verbonden met een open dataset. Nu heb ik een volledig geautomatiseerd systeem dat parkeergegevens van Stad Gent ophaalt, opslaat, aggregeert en visualiseert. Dus als mijn vrienden me vragen waar ze hun auto moeten parkeren voordat we uitgaan, stuur ik ze gewoon deze link naar mijn dashboard! Ik hoop dat dit je inspireert om met je eigen data aan de slag te gaan.

Veel plezier met bouwen!