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
监控所有TaskTracker
与Job
的健康状况,一旦发现失败,就将相应的任务转移到其他节点。JobTracker
会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器TaskScheduler
,而调度器会在资源出现空闲时,选择合适的任务去使用这些资源。TaskTracker
:TaskTracker
会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker
,同时接收JobTracker
发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。TaskTracker
使用slot
等量划分本节点上的资源量(CPU、内存等)。一个Task
获取到一个slot
后才有机会运行,而Hadoop
调度器的作用就是将各个TaskTracker
上的空闲slot
分配给Task
使用。slot
分为Map slot
和Reduce slot
两种,分别供Map Task
和Reduce Task
使用。Task
:分为Map Task
和Reduce Task
,均由Task Tracker
启动。
工作原理
User Program
链接了MapReduce
库,实现了最基本的Map
函数和Reduce
函数。
MapReduce
库先把User Program
的输入文件划分为m
份(用户定义),通常每一份16mb~64mb,如图划分为split 0 ~ split 4。- 使用
fork()
将用户进程拷贝到集群内其他机器上,其中一个称为master
,其余称为worker
。master
负责调度,为空闲worker
分配作业(Map
作业或者Reduce
作业),worker
的数量也是由用户指定。 - 被分配了
Map
作业的worker
,开始读取对应分片的输入数据。Map
作业从输入数据中抽取键值对,每一个键值对都作为参数传递给map
函数,map
函数产生的中间键值对(中间结果)被缓存在内存中。 - 缓存的中间键值对(中间结果)会被定期写入本地磁盘,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个
Reduce
作业。这些中间键值对(中间结果)的位置会被通报给master
,maste
r负责将信息转发给Reduce worker
。 master
向分配了Reduce
作业的worker
通知它所负责的分区的位置,当Reduce worker
把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起。对于每个唯一的键,都将键与关联的值传递给reduce
函数,reduce
函数产生的输出会添加到这个分区的输出文件中。- 当所有的
Map
和Reduce
作业都完成了,master
唤醒正版的user program
,MapReduce
函数调用返回user program
的代码。
案例:统计词频
如果想统计下过去10年计算机论文出现最多的几个单词,看看大家都在研究些什么,那收集好论文后,该怎么办呢?
方法一:我可以写一个小程序,把所有论文按顺序遍历一遍,统计每一个遇到的单词的出现次数,最后就可以知道哪几个单词最热门了。
这种方法在数据集比较耗时,是非常有效的,而且实现最简单,用来解决这个问题很合适。
方法二:写一个多线程程序,并发遍历论文。
这个问题理论上是可以高度并发的,因为统计一个文件时不会影响统计另一个文件。当我们的机器是多核或者多处理器,方法二肯定比方法一高效。但是写一个多线程程序要比方法一困难多了,我们必须自己同步共享数据,比如要防止两个线程重复统计文件。
方法三:把作业交给多个计算机去完成。
我们可以使用方法一的程序,部署到N台机器上去,然后把论文集分成N份,一台机器跑一个作业。这个方法跑得足够快,但是部署起来很麻烦,我们要人工把程序copy到别的机器,要人工把论文集分开,最痛苦的是还要把N个运行结果进行整合(当然我们也可以再写一个程序)。
方法四:使用MapReduce
MapReduce本质上就是方法三,但是如何拆分文件集,如何copy程序,如何整合结果等,这些都是框架定义好的。我们只要定义好这个任务用户程序(Map函数和Reduce函数),其它都交给MapReduce。