Streamové zpracování dat: architektura jako stavebnice LEGO
Současné systémy zpracování dat vyžadují pružnost a škálovatelnost. V tomto článku rozebereme, jak spojit Kafka, Flink, S3 a další komponenty do jediné streamové platformy s využitím principů modulární architektury. Podrobně probereme etapy integrace od generace dat až po analýzu v reálném čase.
Základ systému: streamová platforma
Pro sestavení streamového zpracování použijeme stack ověřených technologií. Centrálním prvkem je Apache Kafka – distribuovaná streamová platforma zajišťující spolehlivé doručení zpráv. Spolu s ní zapojíme:
- Kafka Connect pro integraci s externími systémy
- Schema Registry pro správu schémat dat
- Kafka UI jako vizuální rozhraní pro správu
Klíčový princip – považovat komponenty za moduly LEGO. Každý zodpovídá za konkrétní funkci a spojuje se s ostatními přes jasně definované rozhraní. Pro spuštění minimální konfigurace stačí Docker Compose a Git LFS. Systém se sestavuje přes multi-stage build, což zaručuje reprodukovatelnost prostředí.
Příklad základní konfigurace v docker-compose.yml:
services:
kafka:
image: confluentinc/cp-kafka:8.1.0
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
schema-registry:
image: confluentinc/cp-schema-registry:8.1.0
environment:
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: kafka:9092
Důležité je chápat rozdíl mezi tradičními databázemi a streamovými systémy. Pokud v relačních SÚBD je fokus na stavu (tabulky, záznamy), v streamovém zpracování jde o události. Každá zpráva v Kafka představuje neměnnou událost přidanou na konec logu. Tento přístup umožňuje budovat systémy s zaručeným doručením a obnovou stavu.
Etapy integrace dat
Proces sestavení systému rozdělíme na čtyři logické etapy:
- Ingest – příjem dat z externích zdrojů
- Storage – trvalé uložení
- Transform – transformace a obohacení
- Serve – poskytování výsledků
Ingest: generace a příjem dat
Na etapě Ingest nastavíme zdroj dat přes Kafka Connect. Pro demonstraci implementujeme generátor čtení teplotních senzorů. Konnektor v Javě vytváří syntetická data s geografickými souřadnicemi a teplotou, s ohledem na dobu dne a polohu vůči rovníku.
Konfigurace konnektoru:
{
"connector.class": "dev.miron.connect.temp.TempSourceConnector",
"tasks.max": "1",
"topic": "earth-temp",
"sensors": "5",
"messages.per.sensor.per.second": "1"
}
Všimněte si použití Avro pro serializaci. Zprávy se ukládají v binárním formátu, což snižuje objem provozu a zrychluje zpracování. Schema Registry zajišťuje kontrolu verzí schémat a kontrolu kompatibility (režim BACKWARD). Při změně struktury dat systém automaticky odmítne nesprávná aktualizace.
Storage: dlouhodobé uložení
Pro trvalé uložení použijeme kombinaci S3 a Apache Iceberg. S3 slouží jako objektové úložiště, zatímco Iceberg přidává vrstvu metadat zajišťující ACID transakce a time travel. Tento přístup umožňuje efektivní práci s velkými datovými sadami bez problémů tradičních souborových systémů.
Konfigurace sink-konnektoru:
{
"connector.class": "io.confluent.connect.s3.S3SinkConnector",
"topics": "earth-temp",
"s3.bucket.name": "data-lake",
"storage.class": "io.confluent.connect.s3.storage.S3Storage",
"format.class": "io.confluent.connect.s3.format.avro.AvroFormat"
}
Pro dotazy na data použijeme Trino – distribuovaný SQL engine, který dokáže spojovat data z různých zdrojů. To umožňuje provádět složité analytické dotazy bez přesunu dat.
Transformace dat
Etapu Transform realizujeme přes Apache Flink – engine streamového zpracování s podporou oken a stateful operací. Příklad úlohy: převod teploty ze stupňů Fahrenheita na Celsia a filtrování anomálních hodnot.
DataStream<TempEvent> processed = source
.map(event -> {
event.setCelsius((event.getFahrenheit() - 32) * 5/9);
return event;
})
.filter(event -> event.getCelsius() > -50 && event.getCelsius() < 60);
Flink se integruje s Kafka přes nativní konnektory. Důležité je správně nastavit checkpointing pro zaručení exactly-once zpracování. Parametry:
execution.checkpointing.interval: 60000state.backend: rocksdbstate.checkpoints.dir: file:///checkpoints
Pro monitorování použijeme vestavěné webové rozhraní Flink, kde sledujeme zpoždění zpracování (lag) a stav operátorů.
Servisní vrstva
Na finální etapě se data stávají dostupnými pro spotřebitele. Implementujeme dva varianty:
- PostgreSQL přes JDBC-konnektor pro operativní dotazy
- Redis pro cachování horkých dat
Konfigurace PostgreSQL sink:
{
"connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector",
"connection.url": "jdbc:postgresql://postgres:5432/analytics",
"topics": "processed-temp",
"auto.create": "true",
"insert.mode": "upsert",
"pk.fields": "sensorId,timestamp"
}
Pro Redis použijeme vlastní konnektor, který ukládá poslední čtení pro každý senzor do hash tabulek. To zajišťuje milisekundovou odezvu při dotazech na aktuální data.
Co je důležité
- Schémata dat musí být spravována přes Schema Registry s BACKWARD kompatibilitou
- Stateful zpracování ve Flink vyžaduje nastavení checkpointing a výběr state backend
- Dekompozice systému na etapy Ingest/Storage/Transform/Serve usnadňuje ladění
- Binární serializace (Avro/Protobuf) je klíčová pro výkon streamových systémů
- Testování konfigurací přes Docker Compose umožňuje rychlé změny
— Editorial Team
Zatím žádné komentáře.