Spark Structured Streaming на собеседовании Data Engineer
Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.
Содержание:
Зачем спрашивают на собесе DE
Streaming в Spark — стандарт near-real-time DE. На собесе DE: «как работает SS», «watermark», «output modes».
Архитектура: micro-batching
Spark Structured Streaming — micro-batching. Вместо event-by-event processing — небольшие batches каждые N секунд.
Trigger types:
processingTime='1 minute'— каждую минуту.once=True— один раз и завершить.availableNow=True— обработать всё, что доступно, и стоп.
df = spark.readStream.format("kafka")...
query = df.writeStream \
.format("delta") \
.trigger(processingTime='1 minute') \
.outputMode("append") \
.start("path/to/sink")Continuous processing mode
С 2.3 — экспериментальный true streaming (low latency, < 1 ms). Ограниченные операции (только map-like).
В практике почти не используется — micro-batch достаточно.
Windowing и watermarks
Tumbling window: non-overlapping.
df.groupBy(
F.window("event_time", "10 minutes"),
"user_id"
).count()Sliding window:
F.window("event_time", "10 minutes", "5 minutes") # window_size, slideSession window (с 3.2): разрыв > N → новая сессия.
Watermark. Граница «насколько поздно» можно опаздывать.
df.withWatermark("event_time", "10 minutes")State старше watermark — выбрасывается. Без watermark — state растёт бесконечно.
Late data handling
Watermark = max_event_time - threshold.
Если событие приходит позже watermark:
- В output mode «append» — игнорируется.
- В «update» mode — может update старое окно (если state ещё в памяти).
Пример. Watermark = now - 10 min. Событие с timestamp 30 min ago — late, dropped.
Output modes
Append. Только новые строки в output. Подходит для events, не для aggregations.
Update. Обновлённые rows в output. Аggregations с update mode.
Complete. Весь result table заново. Только для агрегаций. Дорого, использовать редко.
Поддержка зависит от operations:
- Append для aggregations — только с watermark.
- Complete для streams — нельзя.
Exactly-once гарантии
Spark Structured Streaming даёт exactly-once при:
- Replayable source (Kafka, file source с checkpoint).
- Idempotent sink (Delta Lake, Postgres с UPSERT).
- Checkpoint для state.
.option("checkpointLocation", "s3://bucket/checkpoints/...")Checkpoint хранит:
- Offsets источника.
- State for stateful operations.
- Metadata.
При рестарте — продолжает с last checkpoint.
Частые ошибки
Без checkpoint. Restart = заново всё. И state потерян.
Без watermark на aggregation. State растёт unbounded → OOM.
Append mode без watermark на window aggregation. Не работает — Spark должен знать, когда window «closed».
Sink не idempotent. Дублирование при ретраях.
Mixing batch и streaming. Когда join streaming с batch table — handle changes batch.
Игнорировать query.processedRowsPerSecond. Без monitoring — не знаешь, успеваешь ли.
Связанные темы
- Kafka на собесе DE
- Kafka Streams на собесе DE
- Spark RDD vs DataFrame для DE
- CDC и Debezium на собесе DE
- Подготовка к собесу Data Engineer
FAQ
Spark Structured Streaming vs Flink?
Flink — true streaming с lower latency. SS — micro-batching, проще API. Flink лучше для < 100ms latency, SS для всего остального.
Это официальная информация?
Нет. Статья основана на документации Spark 3.x.
Тренируйте Data Engineering — откройте тренажёр с 1500+ вопросами для собесов.