一,基本了解程序员
1.MapReduce关心的是如何划分超大集数据和在大量计算机组成的集群上调度。算法
2.对于海量数据想在短期内完成处理,咱们只要简单描述运算的规则,而不用关心并行,分布,容错,负载均衡等复杂细节。他的原理来源并不是没有来源,是参考了一些函数语言的实用原理,都会有一组逻辑输入用Map处理后获得一组中间值,再Reduce合并中间数据,获得一个想要的目的结果。数据库
3.Map函数能够合并相同k-v pair集合成一个较小的v集合。注意的是咱们能够经过迭代的方式把v传递给Reduce函数,这样就能够处理没法所有放入内存中的大量value值的集合了。编程
4.分布式文件系统经过数据复制来保证在不一样硬盘上数据的有效和可靠性。缓存
5.提交job,一个job包括一系列task,调度系统将任务调度到集群多台可用机器上(实际就是HDFS文件系统控制管理的分布式文件系统)。尽可能让调度算法和要计算的数据靠近。网络
6.而后统计成中间pair,而后传递给reduce合并成结果集。数据结构
二,执行归纳并发
这个是比较核心的执行流程了。基本就是在集群中建立多个工做副本,把map或reduce任务发送到空闲的worker执行。map能解析出key/pair对,而后传递给用户自定义的map函数,按期输出到缓存中(这个会进行分区),完毕后,master通知reduce读取中间值,在排序后将key和value集合传递到reduce函数,处理后输出为分割的文件,做为其余的MapReduce过程的数据输入和其余分布式的数据输入。负载均衡
三,容错框架
1.map处理完毕后会经过master逐步的推送给那些正在工做的reduce任务。
2.master能够按期的ping worker看是否正常,worker完成的map任务会重设空闲装填,会从新安排给worker,若是有worker失效,运行的map,reduce任务也将等待被被从新分配。map执行结果在执行的机器中,故障需从新执行。reduce输出在全局文件系统,不须要从新执行。
3.由于前期的数据文件是已经被分割了的,因此只须要从新执行时效的map任务就能够。(分工)
4.master会按期的写一个checkpoint,若是master失效会从一个checkpoint恢复保存的worker和map,reduce数据结构。由于master进程比较重,失效的话会返回给用户状态,让用户决定是否从新执行map,reduce任务。
5.分布式系统应该也是输入肯定性函数。
6.map对应R个私有文件,reduce对应1个私有文件,完成map会通知master将数据记录在数据结构中。
7.一个任务是可能在多个机器上执行的。如一个reduce任务在多个机器执行后会把临时文件重命名为一个文件(由文件系统保证)。较弱的失效处理没太明白(先认为通常状况是非失效的)
四,存储
1.存储位置策略决定了网络带宽的利用,map任务调度时,会将任务先调度到HDFS副本输入数据所在的机器上或附近机器上尽可能避免跨网络形成大量传输数据。
2.M/R的数量有一个worker的均衡的比例。
3.备用任务是在接近M/R任务尾声时,用备用master执行剩余的任务,完成就完成。这样能够利用百分之几的资源节省更多的时间。
五,技巧
1.在MAP执行完后再使用分区函数时的函数也能决定分区的位置。
2.对应按key随机存取,有顺序就变的有意义了。
3.combiner函数会在执行完map的机器上先合并一次数据结果真后发送给reduce函数,显著的提升了执行的效率。
4.输入/输出类型,输入能够由一个reader来控制是从文件或数据库读取数据,或输出一个用户添加的类型。条件是能够当成key/pair来处理数据。
5.反作用,若是是跨文件一致性要求的任务,必须是肯定性的任务。
6.master会记录内存段或总bus中致使肯定性crush的记录,下次执行时会跳过这些记录。
7.map/reduce比较难debug,因此有一套Map/Reduce库的本地实现版本。
8.状态信息能够记录各个worker的任务状况和进度,失效worker等,能够估算时间和分析。
9.计数器能够做为合并的数据结果和执行完毕后结果验证正确性。
10.对于中间排序会采样key分布状况进行分区。
11.看到读取时间少些,处理后就渐渐开始向reduce传输数据,有备份master节点的执行效率要好些。kill掉了几个worker进程影响不是很明显。
六,经验
1.输入数据本地化,动态负载均衡。
2.mapreduce的成功处在于1.能够用mapreduce库不到半小时写一个简单的程序,这个程序能够在上千的机器上作大规模并发处理。2.可让没有分布式并发开发经验的程序员很容易利用大量资源开发并发分布式应用程序。
3.容错,分布式,并行计算都是mapreduce提供的。
七,总结
1.mapreduce能够当作是真实世界处理海量数据的经验,是对经典模型的的简化和萃取的成果。
2.对于容错它作了上千台机器集群中的处理,而通常的是小规模集群的还交给了程序员处理。
3.高级抽象模型限制编程模型,数据本地优化策略,备用机制和忽略故障,集群机制,排序机制,编程模型缩短操做时间,
八,结束语
1.并行,容错,数据本地化,负载均衡被封装;没有并发分布能力的可使用;编程简单;如排序搜索,数据挖掘,机器学习;解决了数千台机器集群上灵活部署运行MapReduce;简单有效利用计算机资源解决须要大量计算的问题。这些思量都有一些其余框架和应用思想的解决来源。
2.减小网络带宽,数据本地化(速度和网络带宽),重复执行相同任务(备用master接近完成时启动执行,节省了资源利用不平衡问题。这个我以为还不够智能,由于只能是在接近完成,中间什么地方出现问题可能就不容易进行了,目前可能尝试过几回也只能跳过了)。