Spark Structured Streaming на собеседовании Data Engineer

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

Карьерник — 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, slide

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

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

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 при:

  1. Replayable source (Kafka, file source с checkpoint).
  2. Idempotent sink (Delta Lake, Postgres с UPSERT).
  3. 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 — не знаешь, успеваешь ли.

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

FAQ

Flink — true streaming с lower latency. SS — micro-batching, проще API. Flink лучше для < 100ms latency, SS для всего остального.

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

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


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