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;//心跳间隔