MapReduce是一种编程模型,用于大规模数据的并行运算,它极大的方便编程人员在不会分布式编程的情况下,将自己的程序运行在分布式系统上。在软件实现是通过指定一个Map(映射)函数,把一组键值对映射成一组新的键值对,指定并发的Reduce(规约)函数,来保证所有映射的键值对的每一个共享相同的键组。
易于编程;良好的扩展性;高容错性,适合PB级以上海量数据的离线处理
应用场景:
(1).简单的数据统计,比如网站PV,统计
(2).搜索引擎索引
(3).海量数据查找
(4).复杂数据分析算法实现:聚类算法,分类算法,推荐算法,图算法
高容错性:交给一个节点出错时,转移到其他节点
离线处理:批量处理
MapReduce限制:
不适合实时计算
不适合流式计算
不适合DAG计算
编程模型:WordCount
输入—>切分—>键值对—>shuffing(归约)—>reducing—>formal result
input splitting mapping
shuffing:相同的键值整理在一起
reducing:将归约好的输出(相同键的值加起来)
将分片数据解析成键值对:
TextInputFormal Block Split 短应用程序
1.MapReduce 库先把User Program 的输入文件划分为M份,每一份通常有16MB,上图所示为split0-4,然后使用fork将用户进程拷贝到集群内其他机器上。
2.User Program 的中有一个副本称为master,其余称为worker,master是负载调度的,为空闲worker分配作业,worker的数量也是有用户指定的。
3.被分配的Map作业的worker 开始读取对应分片的输入数据,Map作业数量由Master决定,和split一一对应,Map作业从输入数据中抽取键值对,每一个键值对都作为参数传递给map函数,map函数产生的键值对被缓存在内存中。
4.缓存的中间值会被定期写入本地磁盘,而且被分为R个区,R的大小由用户定义的,将来每个区会对应一个Reduce作业;这些中间值对应的位置会通报给Master,Master负责将信息发给Reduce worker。
5.Master通知分配了Reduce作业的worker它负责的分区在什么位置,当Reduce worker把所有它负责的中间键值对都读取过来后,先对它们进行排序,是的相同的键值对聚集在一起。因为不同的键值可能映射到同一个分区也就是同一个Reduce作业上,所以排序必须的。
6.Reduce worker 遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce 函数,reduce函数产生的输出
会添加到这个分区的输出文件中。
7.当所有的Map 和Reduce 作业完成后,Master 负责将MapReduce函数调用的结果返回给User Program 的代码。
上述过程执行完成后,MapReduce 输出放在R个分区的输出文件中。用户通常并不需要合并这R文件,而是将其作为输入交给另一个MapReduce 程序处理。整个过程中,输入数据来自底层分布式文件系统(HDFS)的,中间数据放在本地文件系统,最终输出数据写入底层分布式文件系统(HDFS)的。
Map/Reduce作业和Map/Reduce函数的区别:Map作业处理一个输入数据的分片可能需要调用多次Map函数来处理每个输入键值对;Reduce 作业处理一个分区的中间键值对,期间要对每个不同的键调用reduce函数,Reduce作业最终也对应输出文件