MapReduce

MapReduce是一种编程模型,主要应用于大规模数据集的并行运算。其将并行计算简化为Map和reduce过程,极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。
程序员只需要指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,然后指定并发的Reduce(规约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

MapReduce将复杂的、运行大规模集群上的并行计算过程高度地抽象到两个函数:Map和Reduce
编程容易,不需要掌握分布式并行编程细节,也可以很容易把自己的程序运行在分布式系统上,完成海量数据的计算。
MapReduce采用“分而治之”策略,一个存储在分布式文件系统图中的大规模数据集,会被切分成许多独立的分片(split),这些分片可以被多个Map任务并行处理

MapReduce设计的一个理念是“计算向数据靠拢”,而不是“数据向计算靠拢”,因为移动数据需要大量的网络传输开销
MapReduce框架采用了Master/Slave架构,包括一个Master和若干个Slave。Master上运行JobTracker,Slave上运行TaskTracker
Hadoop框架是用Java实现的,但MapReduce应用程序则不一定要用Java来写

与传统并行框架对比
这里写图片描述

下面举个例子:
例子

  1. 输入的数据为一堆文本,要求从日志文件中提取每一年每天的气温, 且计算每年的最高气温
  2. mapper会解析每行数据, 然后提取有效的数据, 作为输出.
  3. map的输出就是一条一条的 key-value
  4. 通过shuffle之后, 变成reduce的输入, 这是相同的key对应的value被组合成了一个迭代器
  5. reduce的任务是提取每一年的最高气温, 然后输出

工作流程
mapreduce工作流程图

  1. MapReduce库先把user program的输入文件划分为M份(M为用户定义);然后使用fork将用户进程拷贝到集群内其它机器上。
  2. user program的副本中有一个称为master,其余称为worker,master是负责调度的,为空闲worker分配作业(Map作业或者Reduce作业),worker的数量也是可以由用户指定的。
  3. 被分配了Map作业的worker,开始读取对应分片的输入数据,Map作业数量是由M决定的,和split一一对应;Map作业从输入数据中抽取出键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对被缓存在内存中。
  4. 缓存的中间键值对会被定期写入本地磁盘,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个Reduce作业;这些中间键值对的位置会被通报给master,master负责将信息转发给Reduce worker。
  5. master通知分配了Reduce作业的worker它负责的分区在什么位置,当Reduce worker把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起。因为不同的键可能会映射到同一个分区也就是同一个Reduce作业,所以排序是必须的。
  6. reduce worker遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。当所有的Map和Reduce作业都完成了,master唤醒正版的user program,MapReduce函数调用返回user program的代码。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值