学习Hadoop——MapReduce介绍

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作业最终也对应输出文件

猜你喜欢

转载自blog.csdn.net/y805805/article/details/85480916