Skip to content

第十章:批处理

1. 批处理的定位

批处理(Batch Processing)处理的是有界数据集,核心目标是以可接受时长完成大规模计算。相较在线系统看重延迟,批处理更看重吞吐与可重现性。

2. Unix 思想与批处理基础

2.1 小工具组合

catawksortuniq 的管道组合体现了批处理本质:数据流经多个算子逐步变换。

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 数据流引擎

SparkFlinkTezDAG 执行代替“每步落盘”,减少中间物化开销并支持更丰富算子优化。

6.2 容错机制演进

  • 传统 MR:依赖中间文件持久化重试。
  • 新引擎:依赖检查点与血统重算,性能与恢复效率更平衡。

6.3 图计算

图算法迭代性强,不适合反复落盘。Pregel 风格的“顶点消息传递 + 超步同步”更适合 PageRank 等任务。

7. 批处理的持续价值

  • 作为事实基线修正实时系统误差。
  • 承担全量历史重算与离线模型训练。
  • 提供可重放、可审计、可复现的数据生产链路。