De basis van Apache Kafka en streamverwerking · Les

KStream- en KTable-concepten

Onderscheid KStream (een stream met records per record) van KTable (een changelogstream die een gematerialiseerde weergave vertegenwoordigt) in Kafka Streams.

Les 2 van 411 stappen

KStream- en KTable-concepten is een gratis De basis van Apache Kafka en streamverwerking-les op CoddyKit. Dit is les 2 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject De basis van Apache Kafka en streamverwerking. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus De basis van Apache Kafka en streamverwerking bevat in totaal 4 lessen.

KStream en KTable onthuld

In Kafka Streams zijn KStream en KTable fundamentele gegevensabstracties. Ze vertegenwoordigen verschillende manieren om je gegevens te bekijken en te verwerken.

Inzicht in hun verschillen is essentieel voor het bouwen van krachtige realtime-streamverwerkingstoepassingen.

KStream: een stream van gebeurtenissen

Een KStream vertegenwoordigt een onbegrensde, onveranderlijke reeks gegevensrecords. Zie het als een traditioneel logboek of een gebeurtenisstroom.

  • Elk record wordt behandeld als een afzonderlijke, onafhankelijke gebeurtenis.
  • Records worden één voor één verwerkt, in de volgorde waarin ze binnenkomen.
  • Een eerder record wordt nooit 'bijgewerkt'; nieuwe records worden altijd toegevoegd.

Dit is ideaal voor gebeurtenissen zoals klikken, sensormetingen of financiële transacties.

KStream in actie: filteren

Dit is een eenvoudige Kafka Streams-toepassing die een KStream gebruikt om berichten te filteren. De toepassing verwerkt elk record afzonderlijk.

Dit voorbeeld filtert een stream met tekstberichten en behoudt alleen de berichten die het woord "event" bevatten.

import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsBuilder;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KStream;

import java.util.Properties;

public class KStreamFilter {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put(StreamsConfig.APPLICATION_ID_CONFIG, "kstream-filter-app");
        props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_BY_KEY_CLASS_CONFIG, Serdes.String().getClass());
        props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_BY_KEY_CLASS_CONFIG, Serdes.String().getClass());

        StreamsBuilder builder = new StreamsBuilder();
        KStream<String, String> sourceStream = builder.stream("input-topic");

        KStream<String, String> filteredStream = sourceStream
            .filter((key, value) -> value.contains("event"));

        filteredStream.to("output-topic");

        KafkaStreams streams = new KafkaStreams(builder.build(), props);
        System.out.println("KStream filter topology created.");
        System.out.println("It filters messages containing 'event'.");
        // In a real application, you would call streams.start();
        // and manage its lifecycle, e.g., using a shutdown hook.
    }
}

KTable: een dynamische weergave

Een KTable vertegenwoordigt een changelogstream, waarin elk record een update of verwijdering van een rij in een tabel betekent. Het lijkt op een databasetabel die voortdurend wordt bijgewerkt.

  • De waarde van elk record wordt beschouwd als de "laatste" waarde voor de bijbehorende sleutel.
  • Wanneer een nieuw record met een bestaande sleutel binnenkomt, overschrijft het de vorige waarde.
  • Ideaal voor het bijhouden van de huidige toestand van gegevens.

Denk aan gebruikersprofielen, aandelenkoersen of actuele voorraadniveaus.

KTable in actie: de nieuwste toestand

Dit voorbeeld laat zien hoe een KTable de nieuwste waarde voor elke sleutel bijhoudt. Stel je voor dat je de meest recente status van verschillende sensoren volgt.

Wanneer er een nieuw bericht voor een sensor binnenkomt, wordt de status ervan in de KTable bijgewerkt naar de nieuwe waarde.

import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsBuilder;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KTable;
import org.apache.kafka.streams.kstream.Materialized;

import java.util.Properties;

public class KTableLatestState {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put(StreamsConfig.APPLICATION_ID_CONFIG, "ktable-latest-state-app");
        props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_BY_KEY_CLASS_CONFIG, Serdes.String().getClass());
        props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_BY_KEY_CLASS_CONFIG, Serdes.String().getClass());

        StreamsBuilder builder = new StreamsBuilder();
        KTable<String, String> latestStatusTable = builder
            .table("sensor-updates", Materialized.as("latest-sensor-status"));

        // The KTable is defined. In a real app, you might print
        // its contents to another topic or join it with a KStream.
        // latestStatusTable.toStream().to("latest-status-output-topic");

        KafkaStreams streams = new KafkaStreams(builder.build(), props);
        System.out.println("KTable latest state topology created.");
        System.out.println("It tracks the most recent status for each sensor.");
    }
}

KStream versus KTable: belangrijkste verschillen

Hoewel beide gegevens verwerken, verschilt hun fundamentele aard aanzienlijk:

  • KStream: Elk record is een gebeurtenis. Het is een reeks feiten. "Er is iets gebeurd."
  • KTable: Elk record is een update. Het vertegenwoordigt de huidige toestand. "Dit is de huidige waarde."

Zie KStream als een transactielogboek en KTable als het huidige overzicht van saldi.

Wanneer gebruik je KStream

KStreams zijn ideaal wanneer je op afzonderlijke gebeurtenissen moet reageren of gegevens moet verwerken zonder een langdurige toestand op basis van sleutels bij te houden.

  • Gebeurtenissen loggen: Elke gebruikersactie opslaan.
  • Realtimewaarschuwingen: Onmiddellijk een melding sturen wanneer een specifieke gebeurtenis plaatsvindt.
  • Gegevensverrijking (state-less): Informatie aan elke gebeurtenis toevoegen op basis van de inhoud ervan.
  • Filteren en mappen: Gebeurtenissen één voor één transformeren.

Wanneer gebruik je KTable

KTables zijn ideaal voor toepassingen die de meest recente toestand van gegevens moeten bijhouden en opvragen, vaak voor aggregaties of joins.

  • Huidige voorraad: Voorraadniveaus van producten bijhouden.
  • Gebruikersprofielen: De meest recente profielgegevens opslaan.
  • Aggregaties: Unieke gebruikers tellen en verkopen in de loop van de tijd optellen (wanneer geaggregeerde resultaten als een KTable worden opgeslagen).
  • Streams met tabellen joinen: Een KStream verrijken met de huidige gegevens uit een KTable.

Van stream naar tabel: aggregatie

Je kunt een KStream met stateful bewerkingen, zoals aggregatie, omzetten in een KTable. Hiermee wordt een reeks gebeurtenissen omgezet in een voortdurend bijgewerkte toestand.

Als je bijvoorbeeld het aantal keer telt dat woorden voorkomen in een stream met zinnen, krijg je een KTable waarin de sleutel het woord is en de waarde het huidige aantal.

import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsBuilder;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KStream;
import org.apache.kafka.streams.kstream.KTable;
import org.apache.kafka.streams.kstream.Materialized;
import org.apache.kafka.streams.kstream.Produced;

import java.util.Arrays;
import java.util.Properties;

public class KStreamToKTable {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put(StreamsConfig.APPLICATION_ID_CONFIG, "word-count-app");
        props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_BY_KEY_CLASS_CONFIG, Serdes.String().getClass());
        props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_BY_KEY_CLASS_CONFIG, Serdes.String().getClass());

        StreamsBuilder builder = new StreamsBuilder();
        KStream<String, String> textLines = builder.stream("text-input");

        KTable<String, Long> wordCounts = textLines
            .flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
            .groupBy((key, word) -> word)
            .count(Materialized.as("counts-store"));

        wordCounts.toStream().to("word-counts-output", Produced.with(Serdes.String(), Serdes.Long()));

        KafkaStreams streams = new KafkaStreams(builder.build(), props);
        System.out.println("KStream to KTable topology created (Word Count).");
        System.out.println("Counts words from 'text-input' and stores counts in a KTable.");
    }
}

Quiz: KStream versus KTable

Welke van de volgende uitspraken beschrijven een KTable correct?

Samenvatting van KStream en KTable

Je hebt de belangrijkste verschillen tussen KStream en KTable in Kafka Streams geleerd!

  • KStream: Een eventstream die afzonderlijke, onveranderlijke records verwerkt.
  • KTable: Een changelog-stream die een gematerialiseerde, bij te werken weergave van gegevens vertegenwoordigt.

De juiste abstractie kiezen is cruciaal voor efficiënte en betekenisvolle realtime gegevensverwerking. Hierna bekijken we stateless en stateful bewerkingen in Kafka Streams.

Gratis beginnen

Leer De basis van Apache Kafka en streamverwerking met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
12
Lessen
48

Veelgestelde vragen

Is de les “KStream- en KTable-concepten” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad De basis van Apache Kafka en streamverwerking, waaronder “KStream- en KTable-concepten”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus De basis van Apache Kafka en streamverwerking bevat in totaal 4 lessen.

Wat leer ik in “KStream- en KTable-concepten”?

Onderscheid KStream (een stream met records per record) van KTable (een changelogstream die een gematerialiseerde weergave vertegenwoordigt) in Kafka Streams. Je oefent met De basis van Apache Kafka en streamverwerking door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met De basis van Apache Kafka en streamverwerking te beginnen?

Ervaring vooraf is niet nodig. De basis van Apache Kafka en streamverwerking op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “KStream- en KTable-concepten”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over De basis van Apache Kafka en streamverwerking?

Ja. Elke les over De basis van Apache Kafka en streamverwerking bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Een eenvoudige Kafka Streams-app bouwen
  2. KStream- en KTable-concepten
  3. Stateless versus stateful bewerkingen
  4. Serdes en dataserialisatie in Kafka Streams
← Terug naar De basis van Apache Kafka en streamverwerking