本文:参考了网上的博文。出处也不知是哪里,不好意思。最近整理磁盘文档发现的好资料所以整理补充了一下供大家学习参考一下吧。

1.主要组成部分:
  Hadoop包括hdfs与mapreduce两部分,hdfs则为底层的分布式存储系统、mapreduce则为用于处理存储在hdfs中的数据的编程模型。
  mapreduce作业提交执行主要涉及到这几个主要的类:jobclient,JobTracker与TaskTracker。
     1.1.JobClient
             每一个job都会在用户端通过JobClient类将应用程序以及配置参数打包成jar文件存储在HDFS,并把路径提交到JobTracker,然   后由JobTracker创建每一个Task(即MapTask和ReduceTask)并将它们分发到各个TaskTracker服务中去执行。
     1.2.JobTracker
             JobTracker是一个master服务,启动之后JobTracker会接收job,负责调度job的每个子任务task运行于TaskTracker上,并监控它们,如果发现有失败的task就重新运行它。一般情况应该把JobTracker部署在单独的机器上。
     1.3.TaskTracker
             TaskTracker是运行于多个节点上的slaver服务。TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。2.主要数据结构
     2.1.JobInProgress
             JobClient提交job后,JobTracker会创建一个JobInProgress来跟踪和调度这个job,并把它添加到job队列里。JobInProgress会根据提交的job jar中定义的输入数据集(已分解成FileSplit)创建对应的一批TaskInProgress用于监控和调度MapTask,同时在创建指 定数目的TaskInProgress用于监控和调度ReduceTask,缺省为1个ReduceTask。
     2.2.TaskInProgress
             JobTracker启动任务时通过每一个TaskInProgress来launchTask,这时会把Task对象(即MapTask和ReduceTask)序列化写入相应的TaskTracker服务中,TaskTracker收到后会创建对应的TaskInProgress(此TaskInProgress实现非JobTracker中使用的 TaskInProgress,作用类似)用于监控和调度该Task。启动具体的Task进程是通过TaskInProgress管理的TaskRunner对象来运行的。TaskRunner会自动装载job jar,并设置好环境变量后启动一个独立的java child进程来执行Task,即MapTask或者ReduceTask,但它们不一 定运行在同一个TaskTracker中。
     2.3 MapTask和ReduceTask
               一个完整的job会自动依次执行Mapper、Combiner(如有的话)和Reducer,其中Mapper和Combiner是由MapTask调用执行,Reducer则由ReduceTask调用,Combiner实际也是Reducer接口类的实现。Mapper会根据job jar中定义的输入数据集 按<key1,value1>对读入,处理完成生成临时的<key2,List value2>对,如果定义了Combiner,MapTask会在Mapper完成调用该Combiner将相同key的值做合并处理,以减少输出结果集。MapTask的任务全完成即交给ReduceTask进程调用Reducer处理,生成最终结果<key3,value3> 对。
3.整体流程
      一道MapRedcue作业是通过JobClient.rubJob(job)向master节点的JobTracker提交的, JobTracker接到JobClient的请求后把其加入作业队列中。JobTracker一直在等待JobClient通过RPC提交作业,而TaskTracker一直通过RPC向 JobTracker发送心跳heartbeat询问有没有任务可做,如果有,让其派发任务给它执行。如果JobTracker的作业队列不为空, 则TaskTracker发送的心跳将会获得JobTracker给它派发的任务。这是一道pull过程。slave节点的TaskTracker接到任务后在其本地发起Task,执行任务。