我们知道TaskTracker在默认情况下,每个3秒就行JobTracker发送一个心跳包,也就是在这个心跳包中包含对任务的请求。JobTracker返回给TaskTracker的心跳包中包含有各种action(任务),如果有满足在此TaskTracker上执行的任务的话,该任务也就包含在心跳包的响应中。在TaskTracker端有线程专门等待map或reduce任务,并从队列中取出执行。

1. TaskTracker发送心跳包

  TaskTracker是作为一个单独的JVM运行的,它启动以后一直处于offerService()函数中,每隔3秒就执行一次transmitHeartBeat函数,如下所示:

HeartbeatResponse heartbeatResponse = transmitHeartBeat(now);

  该函数具体代码为:

  HeartbeatResponse transmitHeartBeat(long now) throws IOException {
  ......
if (status == null) {
synchronized (this) {
status = new TaskTrackerStatus(taskTrackerName, localHostname,
httpPort,
cloneAndResetRunningTaskStatuses(
sendCounters),
failures,
maxMapSlots,
maxReduceSlots);
}
} //
// 检查是否可以接受新的任务
//
boolean askForNewTask;
long localMinSpaceStart;
synchronized (this) {
askForNewTask =
((status.countOccupiedMapSlots() < maxMapSlots ||
status.countOccupiedReduceSlots() < maxReduceSlots) &&
acceptNewTasks);
localMinSpaceStart = minSpaceStart;
}
......
HeartbeatResponse heartbeatResponse = jobClient.heartbeat(status,
justStarted,
justInited,
askForNewTask,
heartbeatResponseId);
......
return heartbeatResponse;
}

  我们从中可以看出,TaskTracker首先创建一个TaskTrackerStatus对象,其中包含有TaskTracker的各种信息,比如,map slot的数目,reducer slot槽的数目,TaskTracker所在的主机名等信息。然后,对TaskTracker的空闲的slot以及磁盘空间进行检查,如果满足相应的条件时,最终就会通过JobClient(为JobTracker的代理)将心跳信息发送给JobTracker,并得到JobTracker的响应HeartbeatResponse。如下所示,JobClient是InterTrackerProtocol的一个实例,而JobTracker实现了InterTrackerProtocol这个接口。

    this.jobClient = (InterTrackerProtocol)
UserGroupInformation.getLoginUser().doAs(
new PrivilegedExceptionAction<Object>() {
public Object run() throws IOException {
return RPC.waitForProxy(InterTrackerProtocol.class,
InterTrackerProtocol.versionID,
jobTrackAddr, fConf);
}
});

    那么,TaskTracker怎样通过JobTracker的代理与JobTracker进行通信呢?它是通过RPC调用JobTracker的heartbeat(......)方法而实现的。

2. TaskTracker端获取任务

  TaskTracker接收到任务后,会将它们放入到相应的LinkedList中,LinkedList实现了List和Queue接口,它是基于链表实现的FIFO的队列。

heartbeatInterval = heartbeatResponse.getHeartbeatInterval();if (actions != null){
for(TaskTrackerAction action: actions) {
if (action instanceof LaunchTaskAction) {
addToTaskQueue((LaunchTaskAction)action);
......
}
}
  ......

  private void addToTaskQueue(LaunchTaskAction action) {
    if (action.getTask().isMapTask()) {
      mapLauncher.addToTaskQueue(action);
    } else {
      reduceLauncher.addToTaskQueue(action);
    }
    }

 

  TaskTracker启动的时候,创建了两个线程:mapLauncher和reduceLauncher,它们分别处理map任务和reduce任务,map任务有mapLauncher负责将其放入到LinkedList中,reduce任务有reducerLauncher负责将其放入到它维护的LinkedList中。

  public void addToTaskQueue(LaunchTaskAction action) {
synchronized (tasksToLaunch) {
TaskInProgress tip = registerTask(action, this);
tasksToLaunch.add(tip);
tasksToLaunch.notifyAll();
}
}

  mapLauncher或者是reducerLauncher根据接收到的action,创建对应的TaskTracker.TaskInProgress对象,并放入到队列中,唤醒等待的线程进行处理。 如下所示,该线程负责从taskToLaunch中获取task,当有空间的slot时,执行这个task。

  synchronized (tasksToLaunch) {
while (tasksToLaunch.isEmpty()) {
tasksToLaunch.wait();
}
//get the TIP
tip = tasksToLaunch.remove(0);
task = tip.getTask();
LOG.info("Trying to launch : " + tip.getTask().getTaskID() +
" which needs " + task.getNumSlotsRequired() + " slots");
}
.....
//得到空闲的slot后,启动这个task
startNewTask(tip);

  这样,TaskTracker就得到了待处理的任务,具体如何执行请参考下一篇博客。

TaskTracker获取并执行map或reduce任务的过程(一)的更多相关文章

  1. TaskTracker获取并执行map或reduce任务的过程1

    TaskTracker获取并执行map或reduce任务的过程(一) 我们知道TaskTracker在默认情况下,每个3秒就行JobTracker发送一个心跳包,也就是在这个心跳包中包含对任务的请求. ...

  2. TaskTracker执行map或reduce任务的过程2

    TaskTracker执行map或reduce任务的过程(二) 上次说到,当MapLauncher或ReduceLancher(用于执行任务的线程,它们扩展自TaskLauncher),从它们所维护的 ...

  3. TaskTracker执行map或reduce任务的过程(二)

    上次说到,当MapLauncher或ReduceLancher(用于执行任务的线程,它们扩展自TaskLauncher),从它们所维护的LinkedList也即队列中获取到TaskInProgress ...

  4. 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程

    目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...

  5. (转) hadoop 一个Job多个MAP与REDUCE的执行

    http://blog.csdn.net/chaoping315/article/details/6221440 在hadoop 中一个Job中可以按顺序运行多个mapper对数据进行前期的处理,再进 ...

  6. MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程

    在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...

  7. MapReduce剖析笔记之五:Map与Reduce任务分配过程

    在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...

  8. 【hadoop】如何向map和reduce脚本传递参数,加载文件和目录

    本文主要讲解三个问题:       1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数.       2 使用Streaming编写MapReduce程序(C/C++ ...

  9. Hadoop :map+shuffle+reduce和YARN笔记分享

    今天做了一个hadoop分享,总结下来,包括mapreduce,及shuffle深度讲解,还有YARN框架的详细说明等. v\:* {behavior:url(#default#VML);} o\:* ...

随机推荐

  1. JavaScript 参考手册

    http://www.w3school.com.cn/jsref/index.asp https://developer.mozilla.org/zh-CN/docs/Web/JavaScript

  2. Chrome 控制台不完全指南【转载】

    Chrome的开发者工具已经强大到没朋友的地步了,特别是其功能丰富界面友好的console,使用得当可以有如下功效: 更高「逼格」更快「开发调试」更强「进阶级的Frontender」 Bug无处遁形「 ...

  3. 关闭“编辑窗体”后, 主窗体的DatagridView刷新数据的问题

    问题:在关闭一个窗体2后,要刷新窗体1内的datagridview的数据,直接窗体1.datagridview.datasource=dt 是没用的. 解决办法如下: 在主窗体里 创建编辑窗体时 加上 ...

  4. asp.net中Repeater控件用法笔记

    大家可能都对datagrid比较熟悉,但是如果在数据量大的时候,我们就得考虑使用 repeater作为我们的数据绑定控件了.Repeater控件与DataGrid (以及DataList)控件的主要区 ...

  5. SCSS是什么

    SCSS即是SASS的新语法,是Sassy CSS的简写,是CSS3语法的超集,也就是说所有有效的CSS3样式也同样适合于SASS. SASS是CSS3的一个扩展,增加了规则嵌套.变量.混合.选择器继 ...

  6. JAR、WAR、EAR 区别

    JAR包 JAR 文件格式以流行的 ZIP 文件格式为基础: 与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库.组件和插件程序,并可被像编译器和 JVM 这样的工具直接 ...

  7. (转)实战Memcached缓存系统(4)Memcached的CAS协议

    1. 什么是CAS协议 很多中文的资料都不会告诉大家CAS的全称是什么,不过一定不要把CAS当作中国科学院(China Academy of Sciences)的缩写.Google.com一下,CAS ...

  8. Android - 代码片段

    转载说明 本篇文章可能已经更新,最新文章请转:http://www.sollyu.com/android-code-snippets/ 说明 此篇文章为个人日常使用所整理的一此代码片段,此篇文正将会不 ...

  9. IOS中一个简单的粒子效果实现

    1.效果图展示 2.实现思路 1> 首先要实现上面的效果,第一步要处理的就是一个简单的画板,在View上面用鼠标滑动的时候画出线条,这个功能可使用UIBezierPath实现 2> 关于粒 ...

  10. php获取客户端ip地址

    本文介绍一个,php获取客户端的IP地址的实例代码,有需要的朋友参考下吧. 获取客户端IP地址的代码,如下: 复制代码代码示例: <?php//取得客户端IP的函数function get_cl ...