4.4.4 TaskUmbilicalProtocol通信协议

TaskUmbilicalProtocol是Task与TaskTracker之间的通信协议。每个Task通过该协议向对应的TaskTracker汇报自己的运行状况或者出错信息。

按照调用频率,可将该协议中的方法分为两类:一类是周期性被调用的方法,另一类是按需调用的方法。其中,第一类方法主要有以下两个:


//Task向TaskTracker汇报自己的当前状态,状态信息被封装到TaskStatus中

boolean statusUpdate(TaskAttemptID taskId, TaskStatus taskStatus,

JvmContext jvmContext)throws IOException, InterruptedException;

//Task周期性探测TaskTracker是否活着

boolean ping(TaskAttemptID taskid, JvmContext jvmContext)throws IOException;


这两个方法并不是相互独立的,它们之间相互合作,共同完成Task状态汇报的任务。一般情况下,Task每隔3s会调用一次statusUpdate函数向TaskTracker汇报最新进度。然而,如果Task在3s内没有处理任何数据(比如当前记录处理速度太慢),则不再汇报进度,而是直接调用ping方法探测TaskTracker,以确保当前数据处理过程中它一直是活的。

第二类方法在Task的不同运行阶段被调用,其调用时机依次为:

(1)Task初始化

TaskTracker从JobTracker那里接收到一个启动新Task的命令(LaunchTaskAction)后,首先创建一个子进程(Child),并由该子进程调用getTask方法领取对应的Task。

(2)Task运行中

❑汇报错误及异常:Task运行过程中可能会出现各种异常或者错误,而reportDiagnosticInfo/fsError/fatalError方法则分别用以汇报出现的Exception/FSError/Throwable异常和错误。对于Reduce Task而言,还提供了shuffleError方法汇报Shuffle阶段出现的错误。

❑汇报记录范围:Hadoop可通过跳过坏记录提高程序的容错性(具体参考6.5.4节)。为了便于定位坏记录的位置,Task需要通过reportNextRecordRange方法不断向TaskTracker汇报将要处理的记录范围。

❑获取Map Task完成列表:在MapReduce框架中,Reduce Task与Map Task之间存在数据依赖关系。该协议专门为Reduce Task提供了getMapCompletionEvent方法,以方便其从TaskTracker获取已经完成的Map Task列表,进而能够获取Map Task产生的临时数据存放位置,并远程读取(对应Reduce Task的Shuffle阶段)这些数据。

(3)Task运行完成

当Task处理完最后一条记录后,会依次调用commitPending, canCommit和done三个方法完成最后的收尾工作。