文件内容如下:
hello world hello spark hello mapreduce需求:统计每个单词出现多少次
1、Map 阶段
Map 读取每一行文本,切割成单词,输出(单词, 1)
出现一次单词,记计数 1
输入第一行:hello world→ 切割输出
(hello,1) (world,1)第二行:hello spark
(hello,1) (spark,1)第三行:hello mapreduce
(hello,1) (mapreduce,1)Map 输出全部 KV:
(hello,1) (world,1) (hello,1) (spark,1) (hello,1) (mapreduce,1)Map 做的事:拆分数据,打上标记
多个 Map 任务并行处理不同文本块
2、Shuffle 洗牌(搬运分组)
把相同 key 的全部数据收集到一块,发给同一个 Reduce
经过 shuffle 分拣之后分组:
hello → [1, 1, 1] world → [1] spark → [1] mapreduce → [1]✅关键点:
所有的hello全部搬运到同一个 Reduce 任务;
shuffle 要磁盘读写 + 网络传输,数据倾斜就出在这里,如果某个单词几千万条,这个 Reduce 就扛不住 OOM。
3、Reduce 阶段
Reduce 拿到同一个 key 对应的一堆数字,把数字累加求和
hello: 1+1+1 = 3 world:1 spark:1 mapreduce:1输出最终统计结果。
快速记忆
- Map:拆单词,输出 (单词,1)
- Shuffle:把相同单词全部汇集到一处
- Reduce:对相同单词的 1 累加,得到总次数
MapReduce:Map 输出全部写磁盘,再 shuffle;
Spark:前面 map 操作放内存,到 shuffle 这一步才写磁盘;
WordCount 单词统计:
Map 读取文本,切分单词,输出 key‑value
(word,1);Shuffle 将相同 word 的数据分组,网络传输交给同一个 Reduce;
Reduce 对 value 集合求和,输出每个单词计数;
Shuffle 是 IO 开销最大的阶段,数据倾斜发生在此处