MapReduce简述

MapReduce

参考:

https://www.cnblogs.com/lixiansheng/p/8942370.html

https://baike.baidu.com/item/MapReduce/133425?fr=aladdin

概念

MapReduce是面向大数据并行处理的计算模型,用于大规模数据集的并行计算。它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及到的很多系统底层的复杂细节交由系统负责处理。

体系结构

MapReduce体系结构主要由四部分组成:Client, JobTracker, TaskTracker, Task

  • Client:用户编写MapReduce程序通过Client提交到JobTracker端,用户可以通过Client提供的接口查看作业的运行状态。
  • JobTracker:负责资源监控和作业调度,JobTracker监控所有TaskTrackerJob的健康状况,一旦发现失败,就将相应的任务转移到其他节点。 JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器TaskScheduler,而调度器会在资源出现空闲时,选择合适的任务去使用这些资源。
  • TaskTrackerTaskTracker会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。 TaskTracker使用slot等量划分本节点上的资源量(CPU、内存等)。一个Task获取到一个slot后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot分为Map slotReduce slot两种,分别供Map TaskReduce Task使用。
  • Task:分为Map TaskReduce Task,均由Task Tracker启动。

MapReduce简述_第1张图片

工作原理

MapReduce简述_第2张图片
MapReduce简述_第3张图片

User Program链接了MapReduce库,实现了最基本的Map函数和Reduce函数。

  • MapReduce库先把User Program的输入文件划分为m份(用户定义),通常每一份16mb~64mb,如图划分为split 0 ~ split 4。
  • 使用fork()将用户进程拷贝到集群内其他机器上,其中一个称为master,其余称为workermaster负责调度,为空闲worker分配作业(Map作业或者Reduce作业),worker的数量也是由用户指定。
  • 被分配了Map作业的worker,开始读取对应分片的输入数据。Map作业从输入数据中抽取键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对(中间结果)被缓存在内存中。
  • 缓存的中间键值对(中间结果)会被定期写入本地磁盘,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个Reduce作业。这些中间键值对(中间结果)的位置会被通报给mastermaster负责将信息转发给Reduce worker
  • master向分配了Reduce作业的worker通知它所负责的分区的位置,当Reduce worker把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起。对于每个唯一的键,都将键与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。
  • 当所有的MapReduce作业都完成了,master唤醒正版的user programMapReduce函数调用返回user program的代码。

案例:统计词频

如果想统计下过去10年计算机论文出现最多的几个单词,看看大家都在研究些什么,那收集好论文后,该怎么办呢?

方法一:我可以写一个小程序,把所有论文按顺序遍历一遍,统计每一个遇到的单词的出现次数,最后就可以知道哪几个单词最热门了。

这种方法在数据集比较耗时,是非常有效的,而且实现最简单,用来解决这个问题很合适。

方法二:写一个多线程程序,并发遍历论文。

这个问题理论上是可以高度并发的,因为统计一个文件时不会影响统计另一个文件。当我们的机器是多核或者多处理器,方法二肯定比方法一高效。但是写一个多线程程序要比方法一困难多了,我们必须自己同步共享数据,比如要防止两个线程重复统计文件。

方法三:把作业交给多个计算机去完成。

我们可以使用方法一的程序,部署到N台机器上去,然后把论文集分成N份,一台机器跑一个作业。这个方法跑得足够快,但是部署起来很麻烦,我们要人工把程序copy到别的机器,要人工把论文集分开,最痛苦的是还要把N个运行结果进行整合(当然我们也可以再写一个程序)。

方法四:使用MapReduce

MapReduce本质上就是方法三,但是如何拆分文件集,如何copy程序,如何整合结果等,这些都是框架定义好的。我们只要定义好这个任务用户程序(Map函数和Reduce函数),其它都交给MapReduce。

你可能感兴趣的:(分布式与云计算,mapreduce)