Kafka Streams на собеседовании Data Engineer
Карьерник — 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} ← newKTable — материализованное состояние с 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 — новая сессия).
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.
Связанные темы
- Kafka на собесе DE
- Kafka consumer groups для DE
- CDC vs batch loading для DE
- Spark RDD vs DataFrame для DE
- Подготовка к собесу Data Engineer
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+ вопросами для собесов.