用户可以配置和向框架提交 MapReduce 任务(简言之,作业)。一个 MapReduce 作业包括 Map 任务,shuffle过程,排序过程和一套 Reduce 任务。然后框架会管理作业的分配和执行,收集输出和向用户传递作业结果。
MapReduce 是单个 jobstracker 和多个 tasktracker 的组合。一般 jobstracker 和 HDFS 中的 namenode 在同一个节点,也可配置为单独节点;tasktracker 和 datanode 必须是同一个节点。jobstracker 是整个 MapReduce 系统的主控节点。
jobstracker 节点-Master 节点:
1、负责调度构成一个作业的全部任务,将之分配到不同的从属节点上。2、通过心跳机制监控从属节点运行状况。一旦有意外,会立刻将任务转移。
tasktracker 节点-Slave 节点:
1、负责执行主控节点分配的任务。2、tasktracker 和 datanode 是同一个节点,以实现移动运算达到高效性。
MapReduce 任务的构成要素:
1、配置作业 --------------------------------------------------------------------------用户
2、输入分割和派遣 -------------------------------------------------------------------Hadoop 框架
3、接受分割的输入后,每个 Map 任务的启动 ---------------------------------------Hadoop 框架
4、Map 函数,对于每个键值对被调用一次 ------------------------------------------用户
5、shuffle,分割和排序 Map 的的输出并得到快 ------------------------------------Hadoop 框架
6、排序,将shuffle的块进行组合和排序 ---------------------------------------------Hadoop 框架
7、接受排序快后,每个 Reduce 任务的启动 -----------------------------------------Hadoop 框架
8、Reduce 函数,对于每一个关键字和对象的所有数据值被调用一次 ----------------用户
9、收集输出结果,在输出目录存储输出结果,输出结果分为 N 个部分,N是 Reduce 任务的号码 -------------------------------Hadoop 框架
用户负责处理作业初始化,指定输入位置,指定输入和确保输入格式和位置是正确无误的。
框架负责在集群中 TaskTracker 节点上派遣作业,执行 map 过程,shuffle过程,排序过程和 Reduce 过程,把输出写入输出目录,最后通知用户作业完成状态。
当前MapReduce 框架存在的问题:
1. JobTracker 是 MR 框架的 BOSS,只有一个,存在单点故障。2. 全部作业首先经过 JobTracker 处理,其完成了太多的工作造成过多的资源消耗。
3. TaskTracker 上,如果两个消耗大内存的作业被调度到一起,很容易出现 OOM(物理内存不足,也没有可回收的内存)。
4. TaskTracker 上,把资源强制划分为 map 作业槽和 reduce 作业槽。当系统中只有 map 作业或者只有 reduce 作业时,会造成资源的浪费。
5. 部分源代码臃肿不清晰,增加 bug 修复和版本维护的难度。
6. 现在的 MapReduc 框架在有任何重要的或者不重要的变化时都会强制进行系统级别的升级更新。分布式集群的全部节点必须同时做出更新。这些更新会让开发者为了验证他们之前的应用程序是不是适用新的版本而浪费大量时间。