一:mapreduce

1:hadoop1.x的mapreduce

1):JobTracker

负责接收客户端提交的任务请求, 分配系统资源, 分配任务给TaskTracker, 管理任务的失败/重启等操作.

2):TaskTracker

负责接收并执行JobTracker分配的任务, 并与JobTracker保持心跳机制, 向JobTracker报告自己任务的运行状况

3):存在问题

  • 所有的任务都在JobTracker上面进行分配, 调度和监控, 处理. 造成了过多的资源消耗, 当job比较多的时候, 增大了JobTracker机器fail的风险.
  • JobTracker 是 Map-reduce 的集中处理点,存在单点故障。
  • 在 TaskTracker 端,以 map/reduce task 的数目作为资源的表示过于简单,没有考虑到 cpu/ 内存的占用情况,如果两个大内存消耗的 task 被调度到了一块,很容易出现 OOM。
  • 在 TaskTracker 端,把资源强制划分为 map task slot 和 reduce task slot, 如果当系统中只有 map task 或者只有 reduce task 的时候,会造成资源的浪费,也就是前面提过的集群资源利用的问题。

    2:hadoop2.x的mapreduce

    新版的MapReduce也叫作Yarn框架, 其最重要的重构在于将资源分配与任务调度/监控进行了分离.

    1)ResourceManager: 资源调度器

    首先保持和NodeManager的心跳机制, 接受客户端的任务请求, 根据NodeManager报告的资源情况, 启动调度任务, 分配Container给ApplicationMaster, 监控AppMaster的存在情况, 负责作业和资源分配调度, 资源包括CPU, 内存, 磁盘, 网络等, 它不参与具体任务的分配和监控, 也不能管理具体任务的失败和重启等.

    2)ApplicationMaster: 任务管理器

    在其中一台Node机器上, 负责一个Job的整个生命周期. 包括任务的分配调度, 任务的失败和重启管理, 具体任务的所有工作全部由ApplicationMaster全权管理, 就像一个大管家一样, 只向ResourceManager申请资源, 向NodeManager分配任务, 监控任务的运行, 管理任务的失败和重启.

    3)NodeManager: 任务处理器

    负责处理ApplicationMaster分配的任务, 并保持与ResourceManager的心跳机制, 监控资源的使用情况并向RM报告进行报告, 支持RM的资源分配工作.

    4)流程

    Input -> Map -> Sort -> Combine -> Partition -> Reduce -> Output

二:yarn

1:架构图

2:mapreduce和yarn - 图1

2:ResourceManager

负责接受客户端提交的 job,分配和调度资源

启动 ApplicationMaster,判断 job 所需资源
监控 ApplicationMaster,在其失败的时候进行重启
监控 NodeManager

3:ApplicationMaster

为 MapReduce 类型的程序申请资源,并分配任务

负责相关数据的切分
监控任务的执行及容错

4:NodeManager

管理单个节点的资源,向 ResourceManager 进行汇报

接收并处理来自 ResourceManager 的命令
接收并处理来自 ApplicationMaster 的命令