Przetwarzanie 15 milionów pingów GPS dziennie: architektura ETL dla analityki transportowej
System przetwarza 15 milionów współrzędnych GPS z 1800 autobusów na 170 trasach Taszkentu. Pingi napływają co 10 sekund przez API 3TM. Kluczowym wyzwaniem jest przekształcenie izolowanych współrzędnych w ustrukturyzowane dane do analizy: identyfikacja przystanków, korków, kursów i odchyleń od tras.
Ładowarka oparta na asyncio + aiohttp odpytywuje API za pomocą timerów systemd. Dane zapisywane są w PostgreSQL z PostGIS. Orchestracja ETL przez Dagster zapewnia sekwencję: trasy → autobusy → przystanki → aktualizacje GPS.
Wybór stosu technologicznego i rezygnacja z nadmiarowych komponentów
Początkowo testowano Kafkę i ClickHouse, ale nie spełniły one oczekiwań:
- Kafka nie nadaje się do modelu pull przy odpytywaniu API — dodaje narzut bez korzyści.
- ClickHouse jest przedwczesny przy obecnych wolumenach zapytań.
Ostateczny stos:
- Ingestion: asynchroniczna ładowarka w Pythonie, ~360 wstawień/sek na 2 vCPU / 4 GB RAM.
- Storage: PostgreSQL + PostGIS dla tras, przystanków, szeregów czasowych GPS.
- Orchestration: Dagster dla zależności i możliwości śledzenia.
- Spatial Analytics: PySpark dla zadań wymagających dużych mocy — przyciąganie GPS do tras, obliczanie obciążenia.
Warstwa Staging przechowuje surowy JSON przez 1 dzień, następnie ODS strukturyzuje dane w pamięci bez ponownego odczytu z bazy danych.
Wielowarstwowy model danych
Dane organizowane są w trzy warstwy dla skalowalności i audytu:
- ODS: dane operacyjne — trasy, przystanki, bieżące pozycje autobusów.
- DDS (Data Vault 2.0): huby (encje), satelity (atrybuty), linki (relacje). GPS nie jest przechowywany, skupienie na trasach, autobusach, przystankach.
- CDM: modele analityczne. Tabela
fct_bus_trips— PostGIS LineString na kurs z metadanymi: znaczniki czasu, przebieg, prędkość, % dopasowania do trasy.
Data Vault pozwala dodawać atrybuty (telemetria) bez refaktoryzacji modelu.
Algorytmy segmentacji kursów
Segmentacja określa początek/koniec kursu na podstawie trzech sygnałów:
- Prędkość: postój na przystanku początkowym/końcowym.
- Przerwa czasowa >5 min: przerwa w strumieniu.
- Bliskość punktu końcowego trasy.
— Editorial Team
Brak komentarzy.