Kafka Streams на собеседовании Data Engineer

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем спрашивают на собесе DE

Kafka Streams — лёгкая альтернатива Spark Streaming. На собесе DE: «KStream vs KTable», «как сделать window aggregation», «exactly-once семантика».

Что такое Kafka Streams

Java/Scala библиотека для stream processing. Работает поверх Kafka.

Свойства:

  • Embedded library, не отдельный cluster.
  • Чтение из Kafka topics, запись обратно.
  • Stateful via RocksDB on disk.
  • Exactly-once semantics.
  • Auto-scaling через consumer groups.
StreamsBuilder builder = new StreamsBuilder();
KStream<String, Order> orders = builder.stream("orders");

orders
  .filter((key, order) -> order.amount > 100)
  .mapValues(order -> enrichWithCustomer(order))
  .to("enriched-orders");

KStream vs KTable

KStream. Stream of events (records). Append-only.

("user1", login at 10:00)
("user1", logout at 11:00)
("user1", login at 12:00)

3 записи — все валидны.

KTable. Stream of updates по ключу. Latest wins.

("user1", status=offline) → state: {user1: offline}
("user1", status=online)  → state: {user1: online}    ← new

KTable — материализованное состояние с changelog.

Преобразования.

  • stream.toTable() — последнее значение per key.
  • table.toStream() — каждый update как event.

Joins

Stream-Stream. Window-based (события в одном временном окне).

KStream<String, Click> clicks = ...;
KStream<String, View> views = ...;
clicks.join(views,
    (click, view) -> new Activity(click, view),
    JoinWindows.of(Duration.ofMinutes(5))
);

Stream-Table. Каждое событие stream обогащается latest table value.

KStream<String, Order> orders = ...;
KTable<String, Customer> customers = ...;
orders.join(customers,
    (order, customer) -> enrich(order, customer)
);

Table-Table. Foreign key join — сложнее, поддерживается с 2.4+.

Windowing

Tumbling window. Не пересекаются.

[0-5] [5-10] [10-15] ...

Hopping. Пересекаются.

[0-10] [5-15] [10-20]  (hop=5, size=10)

Sliding. Окно перемещается на каждом event.

Session. Группировка по неактивности (если разрыв > N — новая сессия).

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Stateful processing и RocksDB

Stateful operations (joins, aggregations) хранят state в RocksDB локально на каждом instance. Backed up через changelog topic в Kafka.

KTable<String, Long> counts = stream
    .groupByKey()
    .count(Materialized.as("counts-store"));

При rebalance — state восстанавливается из changelog.

Exactly-once

config.put(StreamsConfig.PROCESSING_GUARANTEE_CONFIG, EXACTLY_ONCE_V2);

Kafka Streams даёт exactly-once в pipeline (Kafka → process → Kafka). Использует transactional producer + consumer.

Нюансы:

  • Не покрывает write в external sink (БД, S3) — нужна идемпотентность downstream.
  • Latency чуть выше (transactional commit).

Частые ошибки

Локальное state без RocksDB cleanup. Disk fills up. Запускай compaction, retention.

Stream-Stream join без window. Не работает — обязательно window.

Игнорировать changelog topic. При высоком throughput — большой топик. Tune retention.

KTable вместо KStream для events. Last-value semantics теряет события.

Single instance. Без HA. На один failover — потеря throughput. Run multiple instances.

Связанные темы

FAQ

Kafka Streams vs Spark Structured Streaming?

KStreams — embedded, lower latency, Java-only. Spark — distributed, более fitness, Python/Scala/Java. KStreams предпочтительнее для micro-services.

Kafka Streams в Python есть?

Native — нет. Есть Faust (decreasing maintenance). Лучше Spark Streaming или Flink для Python.

Это официальная информация?

Нет. Статья основана на документации Kafka 3.x.


Тренируйте Data Engineering — откройте тренажёр с 1500+ вопросами для собесов.