专业书籍精读 · DDIA · 第 10 章

批处理

Designing Data-Intensive Applications · Ch 10 · Martin Kleppmann · 2017

EN →

这一章讲什么?

你打开淘宝看到的「猜你喜欢」、打开抖音刷到的推荐、在 Google 搜到的结果——这些背后都有一类不慌不忙、夜里悄悄跑的计算:把成千上万人一整天的行为攒起来,一次性算出「谁可能喜欢什么」「哪个词对应哪些网页」。这一章讲的就是这种攒一大批、一次性算完的活儿,叫批处理,以及它最经典的招式——MapReduce。

先打个比方

批处理就像洗一大桶衣服:不是来一件洗一件(那是「在线服务」,你点一下要马上有反应),而是攒够一整桶,一次性丢进洗衣机——不追求单件多快,追求「一桶下来总共省时省水」。它不在乎你等一秒还是等一小时,只在乎整批算完花多少时间、每小时能洗多少

旧世界为什么难

难点在数据太大了——大到一台机器的硬盘装不下、一个 CPU 一辈子也算不完。你得把活儿拆给上千台机器一起干。可一旦人多,新麻烦就来了:怎么把活公平地分下去?算到一半有台机器死机了怎么办?算完的半成品放哪?这些「协调一大群机器」的脏活,才是真正让人头疼的地方。

核心机制直觉

MapReduce 的核心点子,其实就是「分头数,再归堆汇总」。想象几百个人一起统计一座图书馆里每个作者有几本书:第一步(Map)——每人分一摞书,把每本书写成一张小卡片「作者名 → 1」;第二步(归堆)——把所有卡片按作者名排好队、堆到一起,同一个作者的卡片自然就挨在一块了第三步(Reduce)——每个作者一堆卡片,数一数就是他的书数。「按名字排队、把同名的凑一堆」这一步是整台机器的心脏——正是它让分散在上千台机器上的同类数据,最终能碰头汇总。

带来了什么 / 该怎么选

靠这套「分头数再汇总」,工程师能用一大堆便宜机器啃下海量数据:建出搜索引擎的索引、算出推荐名单、训练模型。更妙的是它不怕出错——输入数据只读不改,某台机器算砸了,换台机器把这块重算一遍就行,连人写错了代码都能改完重跑、不留后遗症。一句诚实的代价:它天生「慢性子」,要等一整批都算完才出结果,所以只适合能等的离线活儿,实时性的场景得靠后面讲的「流处理」。

一句话记住

批处理 = 攒一大批数据、一次性算完,图的是吞吐(每小时啃多少)而非快。招式是 MapReduce:分头数(Map)→ 按名字排队把同类凑堆 → 汇总(Reduce),靠「排序凑堆」把上千台机器的数据碰到一起;输入只读、算错就重算,所以特别皮实。

想进到具体机制、join 策略和示意图? → 切到精读版