Jobtracker向Tasktracker下发命令

来源:互联网 发布:angularjs 2.0不用node 编辑:程序博客网 时间:2024/06/15 02:02
  在Jobtracker更新状态以后,Jobtracker要为Tasktracker构造一个HeartbeatResponse对象作为心跳应答,该对象主要有2个部分内容:下达给Tasktracker的命令和下次心跳的时间**下达命令**Jobtracker将下达给Tasktracker的命令封装成TasktrackerAction类,主要包括了ReinitTrackerAction(重新初始化)、LaunchTaskAction(运行新任务)、KillTaskAction(杀死任务)、KillJobAction(杀死作业)、CommitTaskAction(提交任务)五种。ReinitTrackerAction:Jobtracker接到Tasktracker发送过来的心跳信息后,首先要进行一致性检查。如果发现异常情况,则会要求Tasktracker重新对自己进行初始化,已恢复到一致性的状态。当出现下面2中不一致情况时,Jobtracker会向Tasktracker下达ReinitTrackerAction命令    1、丢失上次心跳应答信息:Jobtracker会保存向每个Tasktracker发送的最近心跳应答信息,如果Jobtracker未刚刚重启且一个Tasktracker并非初次连接Jobtracker(initialContact!=true)而最近心跳应答丢失了,    2、丢失Tasktracker状态信息:jobTracker接收到任何一个心跳信息后,会将Tasktracker状态(封装在类TaskTrackerStatus中)信息保存起来,如果一个Tasktracker非初次连接Jobtracker但状态信息却不存在, LaunchTaskAction:该类封装了Tasktracker新分配的任务,Tasktracker接收到该命令后会启动一个子进程运行该任务,Hadoop将一个作业分解后的任务分成2大类:计算型任务和辅助型任务,其中,计算型任务是处理实际数据的任务,包括Map Task和Reduce Task2种(对应的TaskType类中的MAP和REDUCE2种类型),由专门的任务调度器对它们进行调度,而辅助型任务则不会处理实际的数据,通常用户同步计算型任务或者清理磁盘上无用的目录,包括job-setup task、job-cleanup task、和task-cleanup task三种(对应的ActionType是JOB_SETUP JOB_CLEANUP TASK_CLEANUP),其中job-setup task 和job-cleanup task 分别用作计算型任务开始运行同步标识和结束运行同步标识,而task-cleanup task 则用于清理失败计算型任务已经写到磁盘的部分结果,这种任务由Jobtracker负责调度,运行优先级高于计算型任务。  如果一个正常的Tasktracker尚有空闲的slot(acceptNewTasks=true),则Jobtracker会为该Tasktracker分配新任务,任务顺序是先辅助型任务在计算型任务,选择顺序依次为job-cleanup task 、task-cleanup task 、job-setup task .//优先选择辅助型任务,选择优先级从高到低依次是  job-cleanup task 、task-cleanup task 、job-setup task这样可以要完成了的作业快速结束,提交的的作业立刻进入运行状态
 List tasks = getSetupAndCleanupTasks(taskTrackerStatus);        if (tasks == null ) {          tasks = taskScheduler.assignTasks(taskTrackers.get(trackerName));        }//如果没有辅助型任务,则选择计算型任务,由任务调度器选择一个或者多个计算型任务        if (tasks != null) {          for (Task task : tasks) {            expireLaunchingTasks.addNewTask(task.getTaskID());            if(LOG.isDebugEnabled()) {              LOG.debug(trackerName + " -> LaunchTask: " + task.getTaskID());            }/将分配的任务封装成LaunchTaskAction对象            actions.add(new LaunchTaskAction(task));          }        }
KillTaskAction:该类封装了Tasktracker需杀死的任务,Tasktracker收到该命令后杀掉对应任务、清理工作目录和释放slot,导致Jobtracker向Tasktracker发送该命令的原因有很多主要:1、用户使用 hadoop job -kill-task 或者 hadoop job -fail-task 杀死一个任务或者使一个任务失败2、启用了推测执行机制后,同一份数据可能同时由2个task attempt 处理,当其中一个task attempt执行成功后,另一个处理相同数据的task attempt将会被杀掉3、某个作业运行失败,它的其他任务将被杀掉4、Tasktracker在一定时间内未汇报心跳,则Jobtracker认为其死掉,它上面所有task均标注为死亡

KillJobAction:该类封装了Tasktracker待清理的作业,tasktracker接收到该命令后,会清理作业的临时目录,导致Jobtracker向Tasktracker发送该命令的原因很多

1、用户使用 hadoop job -kill 或者hadoop job -fail杀死一个作业或者使一个作业失败2、作业完成,通知Tasktracker清理该作业的工作目录3、作业运行失败,即同一个作业失败的task数目超过一定比例CommitTaskAction:该类封装了Tasktracker需要提交的任务。为了防止同一个TaskInProcess的2个同时运行的Task Attempt同时打开一个文件或者往一个文件中写数据而产生冲突,Hadoop让每个Task Attempt 写到单独一个文件中(以TaskAttemptID命名,比如attempt_201606092312_0008_r_000000_0)中,通常而言,hadoop让每个Task Attempt将计算结果写到临时目录${mapred.output.dir}/temporary/_${taskid}中,当某个task Attempt成功运行完成,再将运算结果转移到最终目录${mapred.output.dir}中,hadoop将一个成功运行完成的task Attempt结果文件从临时目录"提升"至最终目录的过程,称为“提交任务”。当TaskInProgress中一个任务被提交后,其他任务将会被杀死,同时意味着该TaskInProgress运行完成调整心跳间隔    Tasktracker心跳时间间隔大小应该适度,如果太小,则Jobtracker需要处理高并发的心跳连接请求,必然产生不小的并发压力,如果太大,空闲的资源不能及时汇报给Jobtracker(进而个tasktracker分配任务),造成资源浪费,进而降低了系统的吞吐率。Tasktracker汇报心跳的时间间隔并不是一成不变的,它会随着集群的规模的动态调整而变化,以便能够合理利用Jobtracker的并发处理能力,在hadoop mapreduce中,只有Jobtracker知道某一时刻集群的规模,因此由Jobtracker为每个Tasktracker计算下一次汇报心跳的时间间隔,并通过心跳机制告诉Tasktracker。    Jobtracker允许用户通过参数配置心跳的时间间隔加速比,即每增加mapred.heartbeats.in.second(默认是100,最小1)个节点心跳时间间隔增加mapreduce.jobtracker.heartbeats.scaling.factor(默认是1,最小是0.01)秒。同时为了防止用户参数设置不合理而对Jobtracker产生较大的负载,Jobtracker要求心跳时间间隔至少为3秒
 public int getNextHeartbeatInterval() {    // 获取当前Tasktracker的总数,    int clusterSize = getClusterStatus().getTaskTrackers();    //计算新的心跳间隔    int heartbeatInterval =  Math.max(                                (int)(1000 * HEARTBEATS_SCALING_FACTOR *                                      ((double)clusterSize /                                                 NUM_HEARTBEATS_IN_SECOND)),                                HEARTBEAT_INTERVAL_MIN) ;    return heartbeatInterval;  }
0 0
原创粉丝点击