- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Hadoop任务调度在Master上运行的是JobTracker守护进程,而在Slave.doc
Hadoop任务调度
在Master上运行的是JobTracker守护进程,而在Slave上运行的是TaskTracker守护进程。对于一个作业,首先提交给JobTracker,再由JobTracker对提交的作业进行处理。
用户程序
用户程序通过Job类的submit 方法向JobTracker提交作业,Job类内部使用JobClient类的submitJobInternal 方法来做前期的工作: 1 创建作业ID、系统目录、作业jar包job.jar目录、作业分块描述文件job.split目录、命令行参数、作业描述文件job.xml目录等; 2 通过Job,调用InputFormat.getSplits 将输入数据进行切片,然后写入HDFS的job.split文件里; 3 设置Map任务数,创建作业描述文件job.xml; 4 最后由JobClient.jobSubmitClient.submitJob jobId 提交作业,jobSubmitClient,它实现了JobSubmissionProtocol接口,通过RPC.getProxy 来创建一个对象。
JobTracker
(1)与JobClient通信
JobTracker有一个interTrackerServer的成员变量,它是通过RPC.getServer 来创建对象的。这个对象实现了与JobClient的通信,接收作业的提交。
(2)与TaskTracker通信
TaskScheduler是作业调度器的抽象基类. 具体的实现有JobQueueTaskScheduler: 默认的FIFO调度队列imitTasksPerJobTaskScheduler: 扩展自JobQueueTaskScheduler, 可以对每个Job的task总数作限制apacityScheduler:Yahoo开发的一个基于容量的作业调度器 FairScheduler: 公平调度器, 保证小任务得到快速响应, 大任务保证服务水平, 由facebook开发
JobTracker维护一个JobQueueTaskScheduler的实例JobQueueTaskScheduler类型的对象。TaskScheduler的实现关键是分派任务的策略这体现在assignTasks方法中TaskScheduler所需要的关于集群信息由传入的TaskTrackerManager提供, TaskScheduler运行所需要的关于job的信息由JobQueueJobInProgressListener的Collection getJob 方法提供eagerTaskInitializationListener负责任务Task的初始化这个listener在初始化时会开启一个JobInitThread线程,当作业通过jobAdded job 加入到初始化队列jobInitQueue中,根据作业的优先级排序 resortInitQueue方法 后, 这个线程就会调用JobInProgress.initTasks 立即初始化作业的所有任务。MapTask 和reduceTask,它们的管理对象都是TaskInProgressJobInProgress.initTasks 方法首先从JobClient上传的job.split文件中读取所有数据块的列表,然后根据这个列表创建对应数目的Map执行管理对象TaskInProgress。创建这些TaskInProgress对象完毕后,initTasks 方法会通过createCache 方法为这些对象产生一个未执行任务的Map缓存nonRunningMapCache。slave端的TaskTracker向master发送心跳时,就可以直接从这个cache中取任务去执行。createCache 方法的作用是为以上TaskInProgress对象在网络拓扑结构上分配拥有此任务数据块的节点。从近到远一层一层地寻找,首先是同一节点,然后在寻找同一机柜上的节点,接着寻找相同关换机下的节点,直到找了maxLevel层结束。这样的话,在JobTracker给TaskTracker派发任务的时候,可以迅速找到最近的TaskTracker,让它执行任务。JobInProgress创建完TaskInProgress后,最后构造JobStatus并记录job正在执行中,然后再调用JobHistory.JobInfo.logStarted 记录job的执行日志。JobTracker?接到TaskTracker?的heartbeat ?调用后,首先会检查上一个心跳响应是否完成,是没要求启动或重启任务,如果一切正常,则会处理心跳。JobTracker?会使用它的调度器taskSch
文档评论(0)