ShowLo / SimpleMapReduce

Simple MapReduce Framework

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SimpleMapReduce

A simple MapReduce framework

 因为MapReduce是基于DFS的,所以这里的简单MapReduce是在前面实现的一个简单的DFS框架上进行修改得到的。

MapReduce的主要**是将对大规模数据集的操作分发到由主节点master管理下的各个分节点slave共同完成,然后通过整合各个节点的中间结果得到最终结果。在DFSmaster中,运行着JobTracker,在slave中运行着TaskTrackerJobTracker用于调度工作而TaskTracker用于执行工作。

 在此MapReduce框架中,对前面DFS框架的master做修改得到JobTracker,类似地,对前面DFS框架的slave做修改得到了 TaskTracker。其中JobTracker与前面DFS中的master的区别主要在于其接收了由客户端传过来的文件并进行了分块和分发的工作之后,需要给每个分块指定一个Mapper(这里的Mapper的意义要比原先的略为广泛,还包括了shuffle过程),调度TaskTracker执行Mapper依次对分块进行map操作、combine操作(相同key值进行合并)和shuffle操作(hash(key) % reducerNumber),将Mapper的输出结果存于slave中作为中间结果文件。其中,根据本地计算的**,我们总是把一个与分块对应的Mapper交由拥有此分块的slave上的TaskTracker,以避免从其他slave传输分块。进行完Mapper操作之后,对应于每个分块我们得到了若干个中间结果文件(其数量取决于Reducer的数量),JobTracker根据用户给定的Reducer数量在多个slave上的TaskTracker中随机选择若干个作为即将执行ReducerTaskTracker,然后调度各个TaskTracker从其他slave中将对应于某个Reducer的中间结果文件发送到此Reducer所在的slave上,再由JobTracker通知TaskTracker执行Reducer,得到最终结果(一个Reducer对应一个结果文件)。完成Reduce工作之后,JobTracker会调度TaskTracker删除中间结果。

 这里以实现均值和方差统计功能为例,Mapper中的map操作为:对应一个输入x(即为一个数),包装成{x : 1}的形式输出。combine操作会将相同的x组合到一起,即形成{x : [1, ... , 1]的形式,shuffle操作对key进行hash(key) % reducerNumber的操作,从而对应于一个分块文件,得到了reducerNum个中间文件(reducerNumberReducer的数目)。Reducer中的reduce操作为:对于属于自己处理的所有中间结果块,遍历各个key,取出对应的value(一个列表),对value中所有元素累加得到的是对应key的个数(也就是key这个数出现了几次)并累加到numCount中去,同时将key与其个数相乘然后累加到numSum1中去,将key的平方与其个数相乘然后累加到numSum2中去,那么最终numCount得到的就是数的个数,numSum1得到的就是数的总和,numSum2得到的就是数的总平方和。因为可能有多个Reducer,所以还需要将多个结果文件取回到本地,然后将numCountnumSum1numSum2各自累加得到最终的所有数的个数、总和以及总平方和,最后根据

Image

即可得到所有数的均值mean和方差variance

示例

MapReduce执行过程:

Image Image

MapReduce执行结果:

Image

About

Simple MapReduce Framework


Languages

Language:Python 100.0%