7.2 TaskTracker启动过程分析
TaskTracker服务由TaskTracker类实现。该类实现了四个接口,分别是MRConstants, TaskUmbilicalProtocol, Runnable和TaskTrackerMXBean。其中,MRConstants定义了一些常量;TaskUmbilicalProtocol定义了TaskTracker与Task之间的RPC协议;Runnable是Java库中的线程接口,实现该接口意味着将以线程形式启动TaskTracker;TaskTrackerMXBean实现了一个JMX MXBean,方便外界监控工具(比如Ganglia、Nagios等)获取TaskTracker运行时的信息。
TaskTracker是一个独立的服务,有一个对应的main函数启动它。main函数实现非常简单:创建一个TaskTracker对象并启动它。
public class TaskTracker implements MRConstants, TaskUmbilicalProtocol,
Runnable, TaskTrackerMXBean{
……//成员变量定义和成员函数实现
public static void main(String argv[])throws Exception{
……
JobConf conf=new JobConf();
……
TaskTracker tt=new TaskTracker(conf);//创建TaskTracker对象
MBeans.register("TaskTracker","TaskTrackerInfo",tt);//注册MXBean
tt.run();//启动TaskTracker线程
……
}
……
}
TaskTracker在构造函数中初始化一些重要对象和线程,而在run方法中维护一个与JobTracker的通信连接,以周期性地向JobTracker发送心跳并领取新的任务。
接下来将展开介绍TaskTracker的启动过程,包括重要变量初始化、重要对象初始化等。
7.2.1 重要变量初始化
TaskTracker类中包含很多成员变量,用于管理节点和监控节点上的任务。TaskTracker启动时会初始化这些变量。下面介绍几个非常重要的变量的含义。
volatile boolean running=true;//TaskTracker是否正在运行
InterTrackerProtocol jobClient;//RPC Client,用于与JobTracker通信
short heartbeatResponseId=-1;//心跳响应ID
TaskTrackerStatus status=null;//TaskTracker状态信息
Map<TaskAttemptID, TaskInProgress>tasks=new HashMap<TaskAttemptID,
TaskInProgress>();//该节点上TaskAttemptID与TIP对应关系
Map<TaskAttemptID, TaskInProgress>runningTasks=null;/*该节点上正在运行的
TaskAttemptID与TIP对应关系*/
//该节点正运行的作业列表。如果一个作业中的任务在节点上运行,则把该作业加入该数据结构
Map<JobID, RunningJob>runningJobs=new TreeMap<JobID, RunningJob>();
boolean acceptNewTasks=true;//是否接受新任务,每次汇报心跳时要将该值告诉JobTracker
private int maxMapSlots;//TaskTracker上配置的Map slot数目
private int maxReduceSlots;//TaskTracker上配置的Reduce slot数目
private volatile int heartbeatInterval=HEARTBEAT_INTERVAL_MIN;//心跳间隔