`

关于 hadoop slot的一篇转载

 
阅读更多

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://luobeng.blogbus.com/logs/105015789.html




 hadoop一个节点默认起两个map slot,请问这两个slot是多线程吗?

hadoop-0.21.0 源码中是这样的:

首先看看 org.apache.hadoop.mapred.TaskTracker 类:
=====================================================================================
> 两个类变量 maxMapSlots 和 maxReduceSlots:
-------------------------------------------
    maxMapSlots = conf.getInt(TT_MAP_SLOTS, 2);
    maxReduceSlots = conf.getInt(TT_REDUCE_SLOTS, 2);
  其中 
    public static final String TT_MAP_SLOTS =  "mapreduce.tasktracker.map.tasks.maximum";
    public static final String TT_REDUCE_SLOTS = "mapreduce.tasktracker.reduce.tasks.maximum";
-------------------------------------------
> 类方法 initializeMemoryManagement() 中 ,根据 slots 来决定申请内存的大小
-------------------------------------------
totalMemoryAllottedForTasks =
        maxMapSlots * mapSlotMemorySizeOnTT + maxReduceSlots
            * reduceSlotSizeMemoryOnTT;
-------------------------------------------
> 类方法 TaskTracker.initialize() 中会起两个 TaskLauncher 线程,分别负责启动 Mapper 和 Reduce 任务:
-------------------------------------------
    mapLauncher = new TaskLauncher(TaskType.MAP, maxMapSlots);
    reduceLauncher = new TaskLauncher(TaskType.REDUCE, maxReduceSlots);
-------------------------------------------
=====================================================================================

再看看 org.apache.hadoop.mapred.TaskTracker.TaskLauncher 类,它负责启动 Mapper/Reducer 任务。
=====================================================================================
> 初始化 TaskLauncher 时,需要传入 slots 的数量:
-------------------------------------------
    public TaskLauncher(TaskType taskType, int numSlots) {
      ... ... 
      this.maxSlots = numSlots;
      this.numFreeSlots = new IntWritable(numSlots);
      ... ... 
    }
  特别要注意 numFreeSlots 这个类变量: 
      private IntWritable numFreeSlots;
-------------------------------------------
> TaskLauncher.run() 中,循环地看是否有新的 Task 需要启动,并且看是否有足够的 slots 可用:
-------------------------------------------
  while () {
    while (numFreeSlots.get() < task.getNumSlotsRequired()) {
       .......
    }
    numFreeSlots.set(numFreeSlots.get() - task.getNumSlotsRequired());   // 用完了就减掉
  }
-------------------------------------------
> Task 执行完了以后,需要释放 slots :
-------------------------------------------
    public void addFreeSlots(int numSlots) {
      ... ...
      numFreeSlots.set(numFreeSlots.get() + numSlots);
      ... ...
    }
-------------------------------------------
=====================================================================================


所以,综合上面看, slots 只是一个逻辑值 ( org.apache.hadoop.mapred.TaskTracker.TaskLauncher.numFreeSlots ),而不是对应着一个线程或者进程。TaskLauncher 会维护这个值,以保证资源使用在控制范围内。
帮助理解的最主要的代码可见 : org.apache.hadoop.mapred.TaskTracker.TaskLauncher.run()  。

Mapper 和 Reducer 都是单独的进程,但是它们与 slots 的关系是这样的:
-------------------------------------------
org.apache.hadoop.mapred.TaskTracker.TaskLauncher.run() {
          ... ...
          //got a free slot. launch the task
          startNewTask(tip);
          ... ...
}
-------------------------------------------
这里的 slots 有点类似 “令牌” 的感觉:申请资源,先获得令牌;释放资源,交还令牌。


> mapper 和 reducer 都是单独的进程?好像有点不对,是单独的线程吧?
是单独的进程。

启动Mapper/Reducer的总的调用路径是:
-------------------------------------------
org.apache.hadoop.mapred.TaskTracker.TaskLauncher.run()
->
org.apache.hadoop.mapred.TaskTracker.startNewTask()
->
org.apache.hadoop.mapred.TaskTracker.launchTaskForJob()
->
org.apache.hadoop.mapred.TaskTracker.TaskInProgress.launchTask() 
->
org.apache.hadoop.mapred.Task.createRunner()  //  抽象方法,具体实现在子类 MapTask 和 ReduceTask 中
   |-> org.apache.hadoop.mapred.MapTask.createRunner()  // 创建 MapTaskRunner 类实例
   |-> org.apache.hadoop.mapred.ReduceTask.createRunner()  // 创建 ReduceTaskRunner 类实例
-------------------------------------------
最终,跟踪到了 MapTaskRunner 和 ReduceTaskRunner 这两个类。

至此,我们看看它们的父类 org.apache.hadoop.mapred.TaskRunner ,以下是类的说明:
-------------------------------------------
/** Base class that runs a task in a separate process.  Tasks are run in a
 * separate process in order to isolate the map/reduce system code from bugs in
 * user supplied map and reduce functions.
 */
-------------------------------------------

TaskRunner 虽然 extends Thread (看起来是个线程),但是真正启动Mapper和Reduce进程的代码在函数 TaskRunner.run() 中:
-------------------------------------------
  public final void run() {
      ... ... 
      launchJvmAndWait(setup, vargs, stdout, stderr, logSize, workDir, env);
      ... ... 
  }
-------------------------------------------
其调用了 TaskRunner.launchJvmAndWait() 方法(在此之前还有些创建文件夹、设置配置参数和环境变量等准备性的操作):
-------------------------------------------
  void launchJvmAndWait(List setup, Vector vargs, File stdout,
      File stderr, long logSize, File workDir, Map env)
      throws InterruptedException {
    jvmManager.launchJvm(this, jvmManager.constructJvmEnv(setup, vargs, stdout,
        stderr, logSize, workDir, env, conf));
    synchronized (lock) {
      while (!done) {
        lock.wait();
      }
    }
  }
-------------------------------------------
上面代码主要是 launch 一个 java虚拟机进程。这也是Hadoop启动代价很高的原因,因为launch虚拟机是比较耗资源的;于是又提供了Task JVM Reuse机制。

单 独起进程的原因也说得很清楚,就是: isolate the map/reduce system code from bugs in user supplied map and reduce functions。其实就是,通过使用不同的进程空间,进行隔离,防止用户提供的代码中有bug死掉后,造成 TaskTracker  所在进程也死掉(这个死掉了,效果就跟阿凡达里面的发光树被毁了一样)。

Hadoop-0.20.2源码中的实现基本也是差不多的。
分享到:
评论

相关推荐

    Hadoop 讲义 基础篇

    Hadoop 讲义 基础篇

    hadoop起源Google三篇论文

    hadoop起源Google发表的三篇论文:GFS, Bigtable, MapReduce,英文版

    hadoop2.7.3 hadoop.dll

    在windows环境下开发hadoop时,需要配置HADOOP_HOME环境变量,变量值D:\hadoop-common-2.7.3-bin-master,并在Path追加%HADOOP_HOME%\bin,有可能出现如下错误: org.apache.hadoop.io.nativeio.NativeIO$Windows....

    hadoop相关的十几篇论文

    hadoop相关的十几篇论文,有中文和英文的,学习hadoop很好的资料

    Hadoop相关基础9篇英文论文

    包括《The Google File System》 ...《Mochi:Visual Log-Analysis Based Tools for Debugging Hadoop》 《Ganesha:blackBox diagnosis of MapReduce systems》 《SALAS:Analyzing Logs as StAte Machines》

    关于hadoop开题报告参考.pdf

    关于hadoop开题报告参考.pdf关于hadoop开题报告参考.pdf关于hadoop开题报告参考.pdf关于hadoop开题报告参考.pdf关于hadoop开题报告参考.pdf关于hadoop开题报告参考.pdf关于hadoop开题报告参考.pdf关于hadoop开题报告...

    关于hadoop开题报告参考.docx

    关于hadoop开题报告参考.docx关于hadoop开题报告参考.docx关于hadoop开题报告参考.docx关于hadoop开题报告参考.docx关于hadoop开题报告参考.docx关于hadoop开题报告参考.docx关于hadoop开题报告参考.docx关于hadoop...

    Hadoop下载 hadoop-2.9.2.tar.gz

    Hadoop 是一个处理、存储和分析海量的分布式、非结构化数据的开源框架。最初由 Yahoo 的工程师 Doug Cutting 和 Mike Cafarella Hadoop 是一个处理、存储和分析海量的分布式、非结构化数据的开源框架。最初由 Yahoo...

    Hadoop下载 hadoop-3.3.3.tar.gz

    Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不...

    hadoop_tutorial hadoop入门经典

    hadoop_tutorial hadoop入门经典 Hadoop 是一个能够对大量数据进行分布式处理的软件框架。Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。...

    Hadoop基础篇之搭建Hadoop

    Hadoop基础篇之搭建Hadoop2.2

    关于Hadoop的安装

    关于Hadoop的在Rad hat Linux下的安装资料,

    《Hadoop大数据开发实战》教学教案—01初识Hadoop.pdf

    《Hadoop大数据开发实战》教学教案—01初识Hadoop.pdf《Hadoop大数据开发实战》教学教案—01初识Hadoop.pdf《Hadoop大数据开发实战》教学教案—01初识Hadoop.pdf《Hadoop大数据开发实战》教学教案—01初识Hadoop.pdf...

    hadoop几个实例

    网上很难找的hadoop代码,很适合初学或想从事大数据方向的程序猿,心动者赶紧下载。

    零基础学习hadoop(编程篇).pdf

    零基础学习hadoop(编程篇).pdf

    大数据时代基于Hadoop的一个数据仓库工具hive

    大数据时代基于Hadoop的一个数据仓库工具hive

    hadoop高级应用一

    Hadoop是一个分布式系统基础架构,由Apache基金会开发

    Hadoop权威指南 中文版

    本书从hadoop的缘起开始,由浅入深,结合理论和实践,全方位地介绍hado叩这一高性能处理海量数据集的理想工具。全书共14章,3个附录,涉及的主题包括:haddoop简介:mapreduce简介:hadoop分布式文件系统;hadoop的i...

    云计算Hadoop:快速部署Hadoop集群

    资源名称:云计算Hadoop:快速部署Hadoop集群内容简介: 近来云计算越来越热门了,云计算已经被看作IT业的... Apache Hadoop 是一个软件框架,它可以分布式 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

Global site tag (gtag.js) - Google Analytics