文件内容如下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: 111 3 world:1 spark:1 mapreduce:1输出最终统计结果。快速记忆Map拆单词输出 (单词1)Shuffle把相同单词全部汇集到一处Reduce对相同单词的 1 累加得到总次数MapReduceMap 输出全部写磁盘再 shuffleSpark前面 map 操作放内存到 shuffle 这一步才写磁盘WordCount 单词统计Map 读取文本切分单词输出 key‑value(word,1)Shuffle 将相同 word 的数据分组网络传输交给同一个 ReduceReduce 对 value 集合求和输出每个单词计数Shuffle 是 IO 开销最大的阶段数据倾斜发生在此处