快结课了,该写个总结了。
mapreduce是两个操作步骤,即映射和规约 也是这个分布式计算的思想
主要过程是这样的:
即实现一个指定的Map映射函数,用来把一组键值对映射成新的键值对,再把新的键值对发送个Reduce规约函数,用来保证所有映射的键值对中的每一个共享相同的键组
特点就是:
分不可靠 MP
通过把对数据的大规模操作分发给通信网络上对每个节点,每个节点会周期性的返回它所完成的工作和最新状态,如果一个节点沉默时间超过预设的时间间隔,主节点会认为这个节点挂掉了,并会把原来分配在这个节点上的数据,重新分发给新的节点,保证数据不丢失。
用途:
分不排序,web连接图翻转,web的访问日志分析,文档聚类,机器学习,统计分析等
MapReduce提供了以下的主要功能:
1)数据划分和计算任务调度:
系统自动将一个作业(Job)待处理的大数据划分为很多个数据块,每个数据块对应于一个计算任务(Task),并自动调度计算节点来处理相应的数据块。作业和任务调度功能主要负责分配和调度计算节点(Map节点或Reduce节点),同时负责监控这些节点的执行状态,并负责Map节点执行的同步控制。
2)数据/代码互定位:
为了减少数据通信,一个基本原则是本地化数据处理,即一个计算节点尽可能处理其本地磁盘上所分布存储的数据,这实现了代码向数据的迁移;当无法进行这种本地化数据处理时,再寻找其他可用节点并将数据从网络上传送给该节点(数据向代码迁移),但将尽可能从数据所在的本地机架上寻找可用节点以减少通信延迟。
3)系统优化:
为了减少数据通信开销,中间结果数据进入Reduce节点前会进行一定的合并处理;一个Reduce节点所处理的数据可能会来自多个Map节点,为了避免Reduce计算阶段发生数据相关性,Map节点输出的中间结果需使用一定的策略进行适当的划分处理,保证相关性数据发送到同一个Reduce节点;此外,系统还进行一些计算性能优化处理,如对最慢的计算任务采用多备份执行、选最快完成者作为结果。
4)出错检测和恢复:
以低端商用服务器构成的大规模MapReduce计算集群中,节点硬件(主机、磁盘、内存等)出错和软件出错是常态,因此MapReduce需要能检测并隔离出错节点,并调度分配新的节点接管出错节点的计算任务。同时,系统还将维护数据存储的可靠性,用多备份冗余存储机制提高数据存储的可靠性,并能及时检测和恢复出错的数据。
ps:以上的功能特性是百度的,我也不太懂 总有一天会懂的。
工作原理:
1..MapReduce库先把用户的输入文件划分为M份(M为用户定义)现在一般默认为128Mb
假如将1G数据按照128mb的数据块来划分则 可以划分为8块
2用户工程中的副本中有一个称为master,其余称为worker,master是负责调度的,为空闲worker分配作业(Map作业或者Reduce作业),worker的数量也是可以由用户指定的。、
3.被分配了Map作业的worker,开始读取对应分片的输入数据,Map作业数量是由M决定的,和split一一对应;Map作业从输入数据中抽取出键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对被缓存在内存中。
4..缓存的中间键值对会被定期写入本地磁盘,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个Reduce作业;这些中间键值对的位置会被通报master,master负责将信息转发给Reduce worker。
5.master通知分配了Reduce作业的worker它负责的分区在什么位置(肯定不止一个地方,每个Map作业产生的中间键值对都可能映射到所有R个不同分区),当Reduce
worker把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起。因为不同的键可能会映射到同一个分区也就是同一个Reduce作业(谁让分区少呢),所以排序是必须的。
6.reduce worker遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。
7.当所有的Map和Reduce作业都完成了,master唤醒正版的user program,MapReduce函数调用返回user program的代码。
工作流程图
1. map任务处理
1.1读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
1.2
写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
1.3 对输出的key、value进行分区。
1.4
对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
1.5 (可选)分组后的数据进行归约。
2.reduce任务处理
2.1
对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
2.2
对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、values处理,转换成新的key、value输出。
2.3 把reduce的输出保存到HDFS文件中。
例子:实现WordCountApp
reducer
job
1.map 函数是对集合中的值进行操作,是对集合中元素操作,元素发生变化,但是,数量不变
执行流程:
HDFS上的数据与map 任务沟通时 会被切分split 一个split 对应一个map ,块和split数目不一定相同,每一个reduce任务 对应一个文件。结果存放在目录中
map任务运行在节点上(一个节点可以运行多个map任务,但是一个map任务不能跨多个节点上运行)reduce任务 与map 同理 进入map 键值对 k1 v1原始数据
k3 v3 是结果数据
k2 v2 是中间数据
某些类的数据,送到某些reduce中,这个过程被称为shuffle——数据分配过程
map 和reducer 在为分布式下是在第一个节点的
map 任务数量 一般一个节点会有2个任务
输出流 hdfs 完成
其实在Mr 中最难的就是对业务逻辑的理解,代码都是死的。