1 MapReduce概述
MapReduce源自于Google的MapReduce论文,该论文发表于2004年12月,现在的Hadoop MapReduce是Google MapReduce的克隆版本。
MapReduce的特点:①易于编程:用户不用考虑进程间的通信和套接字编程;②良好的扩展性:当集群资源不能满足计算需求时,可以以增加节点的方式达到线性扩展集群的目的;③高容错性:对于节点故障导致失败的作业,MapReduce计算框架会自动地讲作业安排到健康的节点进行,直到任务完成;④适合PB级以上海量数据的离线处理。
然而,MapReduce不擅长的方面:①实时计算:在毫秒级或秒级内返回结果;②流式计算:MapReduce的输入数据集是静态的,不能动态变化;③DAG(Directed Acyclical Graphs)计算:多个应用程序存在依赖关系,后一个应用程序的输入作为前一个的输出。
2 MapReduce1框架的缺陷
在Hadoop1.X的时代,MapReduce做了很多的事情,其核心是JobTracker。
2.1 MapReduce1架构 
1)首先客户端要编写好MapReduce程序,然后提交作业(job),job的信息会发送JobTracker上。
2)JobTracker为该job分配一个ID值,接下来JobTracker做检查操作,确认输入目录是否存在,如果不存在,则会抛错,如果存在继续检查输出目录是否存在,如果存在则会抛错,否则继续执行;当检查工作都做好了JobTracker就会配置Job需要的资源了。
3)TaskTracker主动与JobTracker通信,接收作业。
4)TaskTracker执行每一个任务。
(1)JobTracker
主要负责资源监控管理和作业调度。
①监控所有TaskTracker 与job的健康状况,一旦发现失败,就将相应的任务转移到其他节点;
②同时JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。
(2)TaskTracker
JobTracker与Task之前的桥梁。
①从JobTracker接收并执行各种命令:运行任务、提交任务、Kill任务、重新初始化任务;
②周期性地通过心跳机制,将节点健康情况和资源使用情况、各个任务的进度和状态等汇报给JobTracker。
(3)Task Scheduler
任务调度器(默认FIFO,先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业)。
(4)Map Task
①Map引擎;
②解析每条数据记录,传递给用户编写的map();
③将map()输出数据写入本地磁盘(如果是map-only作业,则直接写入HDFS)。
(5)Reduce Task
①Reduce引擎;
②从Map Task上远程读取输入数据;
③对数据排序;
④将数据按照分组传递给用户编写的reduce()。
2.2 MapReduce缺陷
Hadoop1.x的MapReduce框架的主要局限:
(1)JobTracker 是 Map-reduce 的集中处理点,存在单点故障,可靠性差;
(2)JobTracker 完成了太多的任务,造成了过多的资源消耗,当 map-reduce job 非常多的时候,会造成很大的内存开销,潜在来说,也增加了 JobTracker 失效的风险,这也是业界普遍总结出老 Hadoop 的 Map-Reduce 只能支持 4000 节点主机的上限,扩展性能差。
(3)可预测的延迟:这是用户非常关心的。小作业应该尽可能快地被调度,而当前基于TaskTracker->JobTracker ping(heartbeat)的通信方式代价和延迟过大,比较好的方式是JobTracker->TaskTracker ping, 这样JobTracker可以主动扫描有作业运行的TaskTracker。
综上所述,MapReduce1已经不能满足我们的需求,因