• 分布式编程架构
    • 以数据为中心,更看重吞吐率
    • 分而治之
    • Map将一个任务分解成子任务
    • Reduce将分解后多任务分别处理,并将结果汇总为最终结果
![MapReduce的体系结构][1]
  • Client
    用户编写的MapReduce程序通过Client提交给JobTracker,同时用户也可以通过Client提供的一些接口查看作业的运行状态

  • ==JobTracker==
    JobTracker是MapReduce架构的主节点,一个MapReduce作业只有一个JobTracker,它负责作业的初始化和分配,与任务节点进行通信,协调整个任务的执行

  • TaskTracker
    TaskTracker是MapReduce架构的任务节点,一个作业中可以存在多个TaskTracker,它负责保持与JobTracker的通信,在分配是数据片上执行Map或Reduce任务.经过TaskTracker的Map运算我们的到来Map输出的中间结果,存储在TaskTracker本地主机上,这些中间结果又作为Reduce操作的输入数据,经过Reduce运算得到MapReduce的最终结果

  • HDFS
    HDFS用于存储作业的输入数据,配置信息等,最终的结果也是存储在HDFS上

基本概念

  • 作业(Job)
    在Hadoop内部用job表示运行一个MapReduce程序所需要用到的所有jar文件和类的集合,这些组件都被最终集成到一个jar文件中,只要把这个jar文件提交给JobTracker,MapReduce程序就会执行

  • ==任务(Task)==
    一个作业中描述了所有输入输出和若干个Task,Task可以分为MapTask和ReduceTask两种,用于分别执行Map操作和Reduce操作

  • 键值对(key/value pair)
    MapReduce程序是通过键值对实现对数据的运算的,HDFS存储的输入数据经过解析后以键值对的形式输入到MapReduce函数进行处理,输出一系列键值对作为中间结果,在Reduce阶段对拥有同样key值得中间数据进行合并,产生最终结果

MapReduce的生命周期

第一阶段:提交作业

用户提交作业前要对作业进行相关配置,主要包括:设计,编写,调试Map函数和Reduce函数,设置作业的输入和输出路径,指定是否对作业的输出进行压缩,用户提交作业后首先由JobClient实例将作业的相关信息(如程序的jar包,作业配置文件等),然后JobClient通过通知JobTracker对新提交的作业进行调度.常用的作业调度算法有FIFO调度,公平调度,容量调度,FIFO调度器是Hadoop的默认调度器,首先按照作业的优先级再按照到达时间的先后顺序选择被执行的作业

第二阶段:分配任务

JobTracker负责任务的分配,TaskTracker会周期性的向JobTracker汇报本节点的资源使用情况,我们称之为心跳.一点某个TaskTracker出现空闲资源JobTracker会按照一定的策略选择一个合适的任务使用该空闲资源,这个工作就是由任务调度器完成的.务调度器使用了双层架构,首先它会选择某个作业,然后再从该作业中选择任务,其中选择任务时重点考虑的是数据是否在本地存储

第三阶段:执行任务

首先TaskTracker将任务相关的代码和配置信息拷贝到本地,然后分别为每个Task启动一个独立的JAVA虚拟机,以避免不同的Task的运行过程中相互影响.TaskTracker为Task准备好运行环境后就会启动Task

第四阶段:状态更新

任务在运行过程中首先会把自己的状态汇报给TaskTracker,然后又TaskTracker汇总报告给JobTracker,JobTracker通过作业计数器来了解整个作业的进度.只有在收到最后一个任务成功运行的消息之后JobTracker才会把这个作业标记为运行成功,并删除中间结果进行善后处理等工作