第十章:批处理
1. 批处理的定位
批处理(Batch Processing)处理的是有界数据集,核心目标是以可接受时长完成大规模计算。相较在线系统看重延迟,批处理更看重吞吐与可重现性。
2. Unix 思想与批处理基础
2.1 小工具组合
cat、awk、sort、uniq 的管道组合体现了批处理本质:数据流经多个算子逐步变换。
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr
2.2 三个关键原则
- 统一接口:以字节流连接工具。
- 组合优先:算子解耦,流程由管道编排。
- 不可变输入:便于重试、回放和调试。
3. MapReduce 与分布式文件系统
3.1 执行模型
MapReduce 将计算拆为 Map -> Shuffle -> Reduce:
Map:从输入生成键值对。Shuffle:按键重分布并排序。Reduce:对同键数据聚合输出。
3.2 HDFS 协同
HDFS 通过数据分块与副本容错,Map 任务尽量靠近数据执行,减少跨网络传输。
3.3 Join 算法
- Reduce 端 Join:通用,代价是全量
shuffle。 - Map 端 Join:要求输入满足先验条件(小表广播、同分区、同排序),性能更优。
3.4 数据倾斜
热点键会让某些 Reducer 成为拖尾任务。常用方案是采样识别热键并拆分处理。
4. 批处理输出与工程哲学
4.1 输出目标
批处理常用于构建搜索索引、维度宽表、聚合结果与离线特征。
4.2 Bulk Load 优先
不建议在任务中高并发直写在线数据库。更稳妥做法是生成底层文件再批量导入。
4.3 不可变结果集
以“新版本全量替换旧版本”的方式发布结果,可获得更好的幂等性、回滚与审计能力。
5. Hadoop 与 MPP 对比
| 维度 | Hadoop 生态 | MPP 数据库 |
|---|---|---|
| 数据模式 | Schema-on-Read,灵活 |
Schema-on-Write,强约束 |
| 计算模型 | 通用代码 + SQL | 以 SQL 为主 |
| 容错粒度 | 任务级重试 | 查询级恢复为主 |
| 典型优势 | 处理异构与非结构化 | 结构化分析性能稳定 |
6. MapReduce 之后
6.1 数据流引擎
Spark、Flink、Tez 以 DAG 执行代替“每步落盘”,减少中间物化开销并支持更丰富算子优化。
6.2 容错机制演进
- 传统
MR:依赖中间文件持久化重试。 - 新引擎:依赖检查点与血统重算,性能与恢复效率更平衡。
6.3 图计算
图算法迭代性强,不适合反复落盘。Pregel 风格的“顶点消息传递 + 超步同步”更适合 PageRank 等任务。
7. 批处理的持续价值
- 作为事实基线修正实时系统误差。
- 承担全量历史重算与离线模型训练。
- 提供可重放、可审计、可复现的数据生产链路。