← Назад к вопросам
В чем разница между 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()
Сравнительная таблица
| Параметр | Batch | Stream |
|---|---|---|
| Latency | Часы/дни | Миллисекунды/секунды |
| Объём данных | Очень большие наборы | Непрерывный поток |
| Сложность | Проще | Сложнее (state management) |
| Стоимость | Ниже | Выше (постоянно запущено) |
| Инструменты | Spark, Hadoop, Flink | Kafka 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
Практические рекомендации
- Начни с Batch — проще разработать и отладить
- Добавь Stream если нужна скорость — реальное время требуемо
- Используй Lambda архитектуру для критичных систем
- Мониторь latency и throughput в production
- Кешируй промежуточные результаты для эффективности
- Используй Spark для обоих (Batch + Structured Streaming)
Выбор между Batch и Stream зависит от SLA (Service Level Agreement) вашего бизнеса и требований к времени отклика.