快速导航
分布式计算框架 MapReduce
文章目录
- MapReduce 介绍
- Shuffle 过程
- WordCount
- Combiner
MapReduce 介绍
- MapReduce 是比较死板的计算框架, 高度抽象
- input 数据集 -> Map 映射成中间数据集(K, V) -> reduce 相同 Key 作为一组迭代计算
- 需要程序员思考数据特征, 设计什么是 Key, 什么是 Value
- 从作业的角度讲, MapReduce 计算框架只有两类作业, MapTask 和 ReduceTask
- 四个阶段
- split 切片 (逻辑切片), 将文件进行拆分
- map 计算 (K, V, P映射), map 数量与 split 数量是对应的关系
- shuffle 洗牌 (把相同的 Key 交给 Reduce 处理), map 是在不同机器上并行处理的, 需要通过 shuffle 将相同 key 值的数据分发到同一个节点上去合并
- reduce 迭代计算
- split 和 shuffle 由框架实现, 需要程序员编程实现的只有 map 和 reduce, 这也是 MapReduce 这个称呼的来源
Shuffle 过程
- 当 map 阶段将数据映射成 K,V,Partition 后 , 会先写入 buffer in memory 内存缓冲区
- 在内存缓冲区中按照 partition 进行第一次排序 (reduce 对应 partition, 一个 partition 中可能有不同K)
- 在内存缓冲区中的 parititon 内按照 K 进行第二次排序
- 内存缓冲区满了之后生成小文件, 一个map端会生成多个小文件, 这些小文件内部有序, 但是小文件之间无序, 所以会进行第三次排序, 将多个小文件合成一个大文件, 作为一个map端的结果
- 多个map并行产生的map端结果文件由reduce端拉取, 还会进行第四次排序, 相同的key放在一起交给 reduce 执行
- 每个 map 任务的计算结果都会写入到本地文件系统,等 map 任务快要计算完成的时候,MapReduce 计算框架会启动 shuffle 过程,在map 端调用一个 Partitioner 接口,对 map 产生的每个进行 reduce 分区选择,然后通过 http 通信发送给对应的 reduce 进程。这样不管 map 位于哪个服务器节点,相同的key一定会被发送给相同的reduce进程。reduce端对收到的进行排序和合并,相同的key放在一起,组成一个传递给reduce执行。
WordCount
- wordcount 统计每个单词出现的数量
- K, V 必须是封装类, Writable 序列化(分布式程序数据交互), Comparable 比较器(实现具体排序)
Combiner
- combiner 是 map 运算后的可选操作,它实际上是一个本地化的 reduce 操作,它主要是在 map 计算出中间文件后做一个简单的合并重复 key 值的操作
- map 在遇到一个单词时就会记录为 1,那么 map 输出文件冗余就会很多,因此在 reduce 计算前对相同的 key 做一个合并操作,需要传输的数据量就会减少,传输效率就可以得到提升
- 但并非所有场景都适合使用 combiner,使用它的原则是 combiner 的输出不会影响到 reduce 计算的最终输入,例如:求总数,最大值,最小值时都可以使用 combiner,但是做平均值计算则不能使用 combiner