第1章

流处理基础概念

理解流处理的核心思想、与批处理的本质差异,以及主流框架的设计哲学,是性能优化的基石。

1.1 流处理与批处理的区别

批处理 (Batch Processing) 与流处理 (Stream Processing) 代表了两种截然不同的数据处理范式。批处理以“静态数据集”为单元,一次性处理有限的数据;流处理则面向“无限数据流”,以低延迟、持续计算为特征。

维度批处理流处理
数据范围有限、有界数据集无限、无界数据流
延迟分钟 ~ 小时级毫秒 ~ 秒级
触发方式定时 / 手动触发事件驱动、持续运行
计算模型全量扫描、多阶段增量计算、状态化
典型框架MapReduce, Spark BatchFlink, Kafka Streams
批处理 数据表 A 数据表 B 全量 Join 流处理 持续事件流 增量计算 延迟 < 100ms

1.2 流处理的应用场景

流处理在需要实时洞察和即时决策的领域扮演关键角色。以下是三个典型场景:

  • 实时监控 — 基础设施指标、业务大盘、异常检测,秒级发现故障。
  • 风控系统 — 交易反欺诈、登录异常检测,毫秒级规则评估。
  • 实时推荐 — 用户行为流 → 特征计算 → 模型推理 → 个性化推送。
数据源 流处理引擎 实时监控 风控系统 实时推荐

1.3 常见流处理框架对比

目前主流的流处理框架包括 Apache Flink、Spark Streaming 和 Kafka Streams。它们在架构、延迟、状态管理等方面各有侧重。

特性FlinkSpark StreamingKafka Streams
计算模型真正的逐事件流处理微批次 (Micro-batch)事件驱动、轻量级库
延迟毫秒级秒级 (批次间隔)毫秒级
状态管理原生状态后端 (RocksDB/Heap)基于 RDD 或 StateStore内置状态存储 (RocksDB)
容错机制分布式快照 (Checkpoint)RDD 血缘 + WALKafka 日志 + 状态备份
部署方式集群 (YARN/K8s/Standalone)集群 (Spark 集群)嵌入式库,无需单独集群
Flink 真正的流处理 毫秒级延迟 丰富状态API Checkpoint容错 Spark Streaming 微批次模型 秒级延迟 RDD血缘容错 生态丰富 Kafka Streams 轻量级库 毫秒级延迟 无单独集群 Kafka原生集成

快速体验:Flink 流处理 WordCount

下面是一个极简的 Flink 流处理示例,展示从 socket 读取文本流并实时统计单词次数:

// Flink 流式 WordCount (Java)
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> text = env.socketTextStream("localhost", 9999);
DataStream<WordWithCount> counts = text
    .flatMap((String line, Collector<WordWithCount> out) -> {
        for (String word : line.split(" ")) {
            out.collect(new WordWithCount(word, 1L));
        }
    })
    .keyBy(wc -> wc.word)
    .sum("count");
counts.print();
env.execute("Streaming WordCount");