diff --git "a/\345\210\206\345\270\203\345\274\217.md" "b/\345\210\206\345\270\203\345\274\217.md" index b55d580..10aea15 100644 --- "a/\345\210\206\345\270\203\345\274\217.md" +++ "b/\345\210\206\345\270\203\345\274\217.md" @@ -12,6 +12,8 @@ [一篇掘金博客](https://juejin.im/post/5bb59f87f265da0aeb7118f2) +### 基本原理 + MapReduce框架通常由三个操作(或步骤)组成: 1. **`Map`**:每个工作节点将 `map` 函数应用于本地数据,并将输出写入临时存储。主节点确保仅处理冗余输入数据的一个副本。 @@ -35,6 +37,41 @@ MapReduce 流程图: +### 容错 + +* worker失效: master会定期ping worker, 如果worker超时没有回复, 那么master认定他为故障. 将它的任务(未完成的Map和Reduce, 以及已完成的Map)重置为初始状态, 然后将它安排给其他的worker. 因为已完成的Map的结果保存在这台worker上, 已完成的reduce存储在全局文件系统上. +* master失效: 周期性将master结构写入磁盘, 作为检查点. 如果master失效了, 从最后一个检查点启动另一个master. 由于master恢复比较麻烦, 所以用户来决定是否重新执行mapreduce. +* Reduce完成时, 以原子的方式把临时文件重命名为最终文件. + + + +### 优化 + +1. 尽量让Map任务在输入数据的机器上执行, 如果不行, 那尽量在附近机器上执行(接近从本地机器读取). +2. 针对"落伍者"问题: 在一个MapReduce操作快完成的时候, master调度备用任务来执行剩下的处于处理中的状态. (提升约40%) + + + +### 技巧 + +1. 分区函数(map的worker分为R个区). 可以简单地使用hash方法, 也可以使用用户自定义的方法, 来实现特殊功能 +2. 对于一个分区(Reduce部分), k-v pair的数据处理顺序是按key递增的 +3. Combiner函数: 允许用户定义一个Combiner函数, 可以让k-v记录在本地进行一次合并, 然后再发送合并地结果. 比如词频统计, 不是将每个(key, 1), 而是将相同的key合并, 生成(key, k), 大大节省成本. + + + +### mapreduce的优势 + +1. 并行计算 + + map任务之间相互独立, 可实现并行计算 + +2. 扩展简单, 只需要增加新的worker即可 + +3. 接口简单. 用户要使用MapReduce系统只需要自己定义map函数和reduce函数, 而不需要自己搭建复杂的分布式系统. + + + @@ -90,6 +127,8 @@ MapReduce 流程图: + + ## raft ### 一些资源