Hadoop集群中分主节点master节点和slave节点,master节点监控slave节点。master和slave之间通过ssh协议进行通信。
master节点上部署有JobTracker和NameNode,当然也可以部署TaskTracker和DataNode。slave节点上部署TaskTracker和DataNode节点。
JobTracker监控TaskTracker,NameNode管理DataNode节点。每个TaskTracker节点又有若干个map和reducer槽。每个map槽或reduce槽就代表一个任务。
TaskTracker监控本机的map和reduce任务。如果map任务或reduce任务有更新,会通过心跳(一般间隔是3秒)告诉TraskTracker,
TraskTracker再通过心跳(一般至少5s,因为代价比较大)告诉JobTracker。
1。整体流程
一道MapRedcue作业是通过JobClient.rubJob(job)向master节点的JobTracker提交的, JobTracker接到JobClient的请求后把其加入作业队列中。
JobTracker一直在等待JobClient通过RPC提交作业,而TaskTracker一直通过RPC向 JobTracker发送心跳heartbeat询问有没有任务可做,如果有,
让其派发任务给它执行。如果JobTracker的作业队列不为空, 则TaskTracker发送的心跳将会获得JobTracker给它派发的任务。这是一道pull过程。
slave节点的TaskTracker接到任务后在其本地发起Task,执行任务。
名词解释
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> 对。