Zpět na domů

Streamové zpracování dat: architektura na Kafka a Flink

Článek o vytváření streamové systému zpracování dat s využitím Apache Kafka, Flink a S3. Podrobně rozebrány fáze integrace, příklady konfigurací a best practices pro production prostředí.

Vytváříme streamovou systém jako stavebnici LEGO: praktické návod
Advertisement 728x90

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í.

Google AdInline article slot

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:

Google AdInline article slot
  • 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.

Google AdInline article slot

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: 60000
  • state.backend: rocksdb
  • state.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

Advertisement 728x90

Číst dál