← Назад к вопросам

В чем разница между batch и stream processing? Когда применять каждый подход?

2.2 Middle🔥 121 комментариев
#Apache Kafka и потоковая обработка

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Batch vs Stream Processing

Batch Processing и Stream Processing — два основных подхода к обработке данных. Выбор зависит от требований к временности и объёму данных.

Batch Processing

Обработка больших объёмов данных за один раз (например, ночью).

# Apache Spark Batch Job
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("BatchJob").getOrCreate()

# Читаем весь набор данных
df = spark.read.parquet("s3://bucket/raw_data/2024-01-15/*")

# Обрабатываем
result = df.groupBy("user_id") \
    .agg({"amount": "sum", "count": "count"}) \
    .filter(col("sum(amount)") > 1000)

# Результат
result.write.parquet("s3://bucket/processed_data/")

Stream Processing

Обработка данных в реальном времени, по мере их поступления.

# Apache Spark Structured Streaming
from pyspark.sql.functions import window, col

df_stream = spark.readStream \
    .format("kafka") \
    .option("kafka.bootstrap.servers", "localhost:9092") \
    .option("subscribe", "events_topic") \
    .load()

# Обрабатываем in real-time
result = df_stream \
    .groupBy(
        window(col("timestamp"), "1 minute"),
        col("user_id")
    ) \
    .agg({"amount": "sum"})

# Запись результата
query = result.writeStream \
    .format("kafka") \
    .option("kafka.bootstrap.servers", "localhost:9092") \
    .option("topic", "aggregated_events") \
    .option("checkpointLocation", "/tmp/checkpoint") \
    .start()

query.awaitTermination()

Сравнительная таблица

ПараметрBatchStream
LatencyЧасы/дниМиллисекунды/секунды
Объём данныхОчень большие наборыНепрерывный поток
СложностьПрощеСложнее (state management)
СтоимостьНижеВыше (постоянно запущено)
ИнструментыSpark, Hadoop, FlinkKafka Streams, Spark Streaming, Flink

Когда применять Batch Processing

1. Ежедневные отчёты и анализ

# Apache Airflow DAG
from airflow import DAG
from airflow.operators.spark_submit_operator import SparkSubmitOperator

with DAG('daily_analytics', start_date=datetime(2024, 1, 1), schedule_interval='@daily'):
    spark_job = SparkSubmitOperator(
        task_id='run_analytics',
        application='/path/to/job.py',
        spark_conn_id='spark'
    )

2. Обработка исторических данных

  • Полная переобработка архива
  • Миграция старых данных

3. Сложная обработка

  • JOIN больших таблиц
  • Статистический анализ
  • Machine Learning обучение

4. Когда latency не критичен

  • Не нужны результаты сейчас
  • Данные накапливаются за день

Когда применять Stream Processing

1. Real-time мониторинг и алерты

# Kafka Streams
from kafka import KafkaConsumer, KafkaProducer
import json

consumer = KafkaConsumer('transactions')
producer = KafkaProducer(bootstrap_servers=['localhost:9092'])

for message in consumer:
    data = json.loads(message.value)
    
    if data['amount'] > 10000:
        alert = {
            'user_id': data['user_id'],
            'status': 'ALERT',
            'reason': 'Large transaction'
        }
        producer.send('alerts', json.dumps(alert).encode())

2. Real-time рекомендации

  • Персонализированные предложения
  • Динамические цены

3. Обработка IoT данных

  • Сенсоры, GPS координаты
  • Дорожное движение в реальном времени

4. Click stream анализ

  • Поведение пользователей на сайте
  • A/B тестирование

5. High-volume событийные системы

  • 100K+ событий в секунду
  • Нужна немедленная реакция

Гибридный подход: Lambda Architecture

Комбинирует batch и stream для лучшего результата:

# Speed Layer (Stream) — реальное время
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("LambdaSpeed").getOrCreate()
df_stream = spark.readStream.format("kafka").load()
df_stream.writeStream.format("kafka").start()

# Batch Layer (Batch) — полная переобработка
df_batch = spark.read.parquet("s3://bucket/historical_data")
result_batch = df_batch.groupBy("user_id").agg({"amount": "sum"})
result_batch.write.parquet("s3://bucket/master_data")

# Serving Layer — объединяет оба результата

Примеры инструментов

Batch:

  • Apache Spark
  • Apache Hadoop
  • Presto/Trino
  • Dbt

Stream:

  • Apache Kafka Streams
  • Apache Flink
  • Spark Structured Streaming
  • Amazon Kinesis

Практические рекомендации

  1. Начни с Batch — проще разработать и отладить
  2. Добавь Stream если нужна скорость — реальное время требуемо
  3. Используй Lambda архитектуру для критичных систем
  4. Мониторь latency и throughput в production
  5. Кешируй промежуточные результаты для эффективности
  6. Используй Spark для обоих (Batch + Structured Streaming)

Выбор между Batch и Stream зависит от SLA (Service Level Agreement) вашего бизнеса и требований к времени отклика.

В чем разница между batch и stream processing? Когда применять каждый подход? | PrepBro