概述
JobTrakcer包含一个main函数,main函数中有两行启动JobTracker的核心代码:
JobTracker tracker = startTracker(new JobConf());
tracker.offerService();
重要对象初始化
跟踪startTracker()函数内部,它最终创建了一个JobTracker对象,该对象对一些重要对象进行了初始化。
ACLsManager类:
权限管理类,提供了checkAccess方法以对用户的各种操作进行权限检查。两种权限:队列权限和作业权限,分别由QueueManager和JobACLsManager类管理。 队列权限:作业提交权限(哪些用户可向队列提交作业)和作业管理权限(哪些用户可以管理该队列中的作业) 作业权限:作业查看权限和作业修改权限
HttpServer类:
Hadoop对外提供Web服务的HTTP服务器,封装了轻量级的web服务器。
DNSToSwitchMapper接口
定义了将DNS名称或者节点IP地址转换成网络位置的规则,Hadoop以层次树的方式定义节点的网络位置,并依据该位置存取数据或者调度任务。
各种线程功能
几个重要的后台服务线程
expireTrackersThread线程:
该线程用于发现和清理死掉的TaskTracker,每个TaskTracker会周期性地通过心跳向JobTracker汇报信息,JobTracker会记录每个TaskTracker最新的心跳汇报时间。如果某个TaskTracker超过10分钟没有汇报心跳,JobTracker认为它死去,清除它的相关信息,同时将正在运行的任务状态标注为killed_unclean
retireJobsThread线程:
该线程主要用于清理长时间驻留在内存中的已经运行完成的作业信息。满足下面条件时,就会被转移到过期队列中:
- 作业已经运行完成,即运行状态为SUCCEEDED、FAILED、KILLED
- 作业完成时间距现在已经超过24小时
- 作业拥有者已经完成作业总数超过100个
过期作业放到过期队列中,过期作业超过1000个,会从内存中彻底删除
expireLaunchingTaskThread线程
用于发现已经被分配给某个TaskTracker但一直没有汇报信息的任务,10分钟没汇报就认为是分配失败,并标注状态为FAILED.
compeletedJobsStoreThread线程
将已经运行完成的作业运行信息保存到HDFS上,提供了一套存取这些信息的API。 该线程解决两个问题:
- 用户无法获得很久之前的作业运行信息:因为会定期清除内存中的完成作业。
- JobTracker重启后作业运行信息丢失
该线程通过保存作业运行日志的方式,使得用户可以查询到任意时间提交的作业和还原作业的运行信息
作业恢复
JobTracker存在单点故障问题,所以Hadoop设计了作业恢复机制。 过程:
作业从提交到运行结束的整个过程中,JobTracker会为一些关键事件记录日志,对于作业而言,关键事件包括作业提交、作业创建、作业运行开始、结束、作业运行失败、作业被杀死等等;对于任务而言,关键事件包括任务创建、任务开始、结束、任务运行失败、任务被杀死等等。 作业恢复主要就是通过日志恢复,并重新调度未运行完成的任务。
|