流处理基础概念
理解流处理的核心思想、与批处理的本质差异,以及主流框架的设计哲学,是性能优化的基石。
1.1 流处理与批处理的区别
批处理 (Batch Processing) 与流处理 (Stream Processing) 代表了两种截然不同的数据处理范式。批处理以“静态数据集”为单元,一次性处理有限的数据;流处理则面向“无限数据流”,以低延迟、持续计算为特征。
| 维度 | 批处理 | 流处理 |
|---|---|---|
| 数据范围 | 有限、有界数据集 | 无限、无界数据流 |
| 延迟 | 分钟 ~ 小时级 | 毫秒 ~ 秒级 |
| 触发方式 | 定时 / 手动触发 | 事件驱动、持续运行 |
| 计算模型 | 全量扫描、多阶段 | 增量计算、状态化 |
| 典型框架 | MapReduce, Spark Batch | Flink, Kafka Streams |
1.2 流处理的应用场景
流处理在需要实时洞察和即时决策的领域扮演关键角色。以下是三个典型场景:
- 实时监控 — 基础设施指标、业务大盘、异常检测,秒级发现故障。
- 风控系统 — 交易反欺诈、登录异常检测,毫秒级规则评估。
- 实时推荐 — 用户行为流 → 特征计算 → 模型推理 → 个性化推送。
1.3 常见流处理框架对比
目前主流的流处理框架包括 Apache Flink、Spark Streaming 和 Kafka Streams。它们在架构、延迟、状态管理等方面各有侧重。
| 特性 | Flink | Spark Streaming | Kafka Streams |
|---|---|---|---|
| 计算模型 | 真正的逐事件流处理 | 微批次 (Micro-batch) | 事件驱动、轻量级库 |
| 延迟 | 毫秒级 | 秒级 (批次间隔) | 毫秒级 |
| 状态管理 | 原生状态后端 (RocksDB/Heap) | 基于 RDD 或 StateStore | 内置状态存储 (RocksDB) |
| 容错机制 | 分布式快照 (Checkpoint) | RDD 血缘 + WAL | Kafka 日志 + 状态备份 |
| 部署方式 | 集群 (YARN/K8s/Standalone) | 集群 (Spark 集群) | 嵌入式库,无需单独集群 |
快速体验: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");