百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

失眠大数据架构师分享MapReduce V1:TaskTracker设计概要分析

bigegpt 2024-09-24 07:21 3 浏览

前言

我们基于Hadoop 1.2.1源码分析MapReduce V1的处理流程。
本文不打算深入地详细分析TaskTracker某个具体的处理流程,而是概要地分析TaskTracker在MapReduce框架中的主要负责处理那些事情,是我们能够在宏观上了解TaskTracker端都做了哪些工作。我尽量将TaskTracker端的全部要点内容提出来,但是涉及到详细的分析,只是点到为止,后续会对相应模块的处理流程结合代码进行分析。
TaskTracker主要负责MapReduce计算集群中Task运行的管理,所以TaskTracker要管理的事情比较多。一个MapReduce Job由很多的Task组成,而一个Job的所有Task被分成几个相斥的子集,每个子集被分配到某一个TaskTracker上去运行,所以一个TaskTracker管理运行了一个Job的所有Task的一个子集,也就是说TaskTracker不仅要维护每个Job对应的一个Task的子集,还要维护这些Task所属的Job的运行状态,对于Job/Task的状态的管理都是与JobTracker通过RPC通信保持状态的同步。
下面是TaskTracker端的主要组件,如下图所示:

为了了解TaskTracker中各个组件都负责处理哪些工作,我们通过下表来简要地说明各个组件的功能,如下表所示:

通过上表,我们可以了解到TaskTracker端各个组件的基本功能,也稍微了解到组件之间的一些关系。下面,我们从TaskTracker抽象层次的视角,来分析组件之间的关系和交互,概要地描述一些主要的处理流程:

  • TaskTracker处理心跳响应
  • MapReduce Job恢复运行
  • Task隔离运行
  • 启动MapTask过程
  • 启动ReduceTask过程

下面,我们分别分析上述列举的5个处理流程:

TaskTracker处理心跳响应

TaskTracker周期性地向JobTracker发送心跳报告,将TaskTracker上运行的Task的状态信息、节点资源信息、节点健康状况信息封装到TaskTrackerStatus对象中,通过RPC调用heartbeat将心跳发送到JobTracker端,并返回HeartbeatResponse,其中心跳响应对象中包包含了JobTracker分配的任务,通过TaskAction这种指令(包括:LaunchTaskAction/KillTaskAction/CommitTaskAction)列表的方式进行指派。TaskTracker解析RPC调用返回的心跳响应,根据TaskAction指令列表,执行具体的操作。TaskTracker处理心跳响应的流程,如下序列图所示:

TaskTracker收到心跳响应,首先会检查是否存在需要恢复的Job,如果存在,则会检查要进行恢复的Job的状态,从而将需要进行恢复的Job对应的Task加入到恢复队列中,等待调度运行。接着,TAskTracker会检查TaskAction指令的类型,根据其实际类型,执行对应的处理流程:

  • 如果是LaunchTaskAction,则启动Task
  • 如果是KillTaskAction,则杀掉Task,修改TaskTracker维护的Job及Task状态,并清理临时数据
  • 如果是KillJobAction,则杀掉该Job,说明该Job已经完成(成功/失败),修改TaskTracker维护的Job及Task状态,并清理临时数据
  • 如果是CommitTaskAction,则说明对应的该Task已经执行完成,修改TaskTracker维护的Task即Job状态,最后还要清理临时数据

由于某些重要的处理流程,如启动一个Task的详细流程,我们会在后续单独写几篇文章,用更加合适的方式来详细分析。

MapReduce Job恢复运行

这里,我们介绍一下MapReduce计算中是如何实现Job的恢复的,包括JobTracker端和TaskTracker端之间的简单交互流程。JobTracker存在一个系统目录(System Directory),默认值为/tmp/hadoop/mapred/system,也可以根据配置项mapred.system.dir指定该值。当JobClient提交一个Job到JobTracker时,JobTracker会首先将该Job的信息写入到JobTracker的系统目录下,每个Job对应一个以Job ID为名称的子目录,以便JobTracker因为重启,能够恢复这些Job的运行。我们可以看一下JobTracker中submitJob方法中保存Job信息的实现,代码如下所示:

// Store the job-info in a file so that the job can be recovered
// later (if at all)
// Note: jobDir & jobInfo are owned by JT user since we are using
// his fs object
if (!recovered) {
  Path jobDir = getSystemDirectoryForJob(jobId); // Job目录,例如:/tmp/hadoop/mapred/system/job_200912121733_0002
  FileSystem.mkdirs(fs, jobDir, new FsPermission(SYSTEM_DIR_PERMISSION));
  FSDataOutputStream out = fs.create(getSystemFileForJob(jobId)); // Job文件,例如:/tmp/hadoop/mapred/system/job_200912121733_0002/job-info
  jobInfo.write(out); // 将JobInfo结构对应的数据写入到Job文件
  out.close();
}

上面代码中,JobInfo主要包含了JobID信息、用户名称、Job提交目录(例如,/tmp/hadoop/mapred/staging/shirdrn/.staging/job_200912121733_0002/ ,该目录是在JobClient提交Job时在HDFS上创建的,用于将该Job所需要的资源都拷贝到该Job对应的提交目录下面,便于后续JobTracker能够读取这些数据)。如果JobTracker因为某些原因重新启动了,那么在JobTracker重启之后,需要从JobTracker的系统目中读取这些Job的信息,以便能够恢复这些尚未完成的Job的运行,并以HeartbeatResponse的结构,在TaskTracker发送Heartbeat的时候响应给TaskTracker,TaskTracker解析响应数据,然后去恢复这些Job的运行。上面的序列图中,我们可以看到,当TaskTracker发送Heartbeat并收到响应后,从HeartbeatResponse中解析取出需要Recovered的Job,并进行处理,代码如下所示:

// Check if the map-event list needs purging
Set<JobID> jobs = heartbeatResponse.getRecoveredJobs(); // 获取到需要Recovered的Job列表
if (jobs.size() > 0) {
  synchronized (this) {
    // purge the local map events list
    for (JobID job : jobs) {
      RunningJob rjob;
      synchronized (runningJobs) { // TaskTracker维护的当前在其上运行的Job列表
        rjob = runningJobs.get(job);        
        if (rjob != null) {
          synchronized (rjob) {
            FetchStatus f = rjob.getFetchStatus();
            if (f != null) {
              f.reset();
            }
          }
        }
      }
    }
 
    // Mark the reducers in shuffle for rollback
    synchronized (shouldReset) {
      for (Map.Entry<TaskAttemptID, TaskInProgress> entry
           : runningTasks.entrySet()) {
        if (entry.getValue().getStatus().getPhase() == Phase.SHUFFLE) {
          this.shouldReset.add(entry.getKey()); // 将处于SHUFFLE阶段的Task放到shouldReset集合中
        }
      }
    }
  }
}

通过上面的代码我们可以看到,当JobTracker重启的时候,已经在TaskTracker上运行的属于某些Job的Task可能无法立即感知到,对应的Job仍然存在于TaskTracker的runningJobs集合中。在JobTracker重启之后,TaskTracker所发送的第一个Heartbeat返回的响应数据中,应该会存在需要Recovered的Job列表,所以这时在TaskTracker端只需要从runningJobs中取出需要Recovered的Job,并查看其是否存在Fetch状态,如果存在,应该重新设置状态(主要对应于MapEventsFetcherThread 维护的TaskCompletionEvent列表,触发ReduceTask拉取MapTask的输出中间结果),以便该Job的各个Task恢复运行。如果该ReduceTask正在运行于SHUFFLE阶段,需要将对应的Job的MapTask的输出拷贝到该ReduceTask所在的节点上,通过调用FetchStatus的reset方法重置状态,这样就重新恢复了ReduceTask的运行。

Task隔离运行

由于MapReduce用户程序包含用户代码,可能会存在Bug,为了不因为用户代码存在的Bug影响TaskTracker服务,所以MapReduce采用了隔离Task运行的方式来运行MapTask/ReduceTask。在运行Task时,会单独创建一个独立的JVM实例,让Task的代码再该JVM实例中加载运行,TaskTracker需要跟踪该JVM实例中运行的Task的状态。在TaskTracker端,加载一个运行Task的JVM实例,是通过org.apache.hadoop.mapred.Child类来实现。下面,我们看一下Child类是如何实现Task加载运行的,如下面序列图所示:

Child类包含一个入口主方法main,在运行的时候需要传递对应的参数,来运行MapTask和ReduceTask,通过上面序列图我们可以看出,命令行输入如下5个参数:

  • host:表示TaskTracker节点的主机名称
  • port:表示TaskTracker节点RPc端口号
  • taskID:表示启动的Task对应的TaskAttemptID,标识一个Task的一个运行实例
  • log location:表示该Task运行实例对应的日志文件的路径
  • JVM ID:表示该Task实例对应的JVMId信息,包括JobID、Task类型(MapTask/ReduceTask)、JVM编号(标识该JVM实例对应的id)

有了上述参数,就可以获取到一个Task运行所需要的全部资源,如一个Task处理哪一个Split,一个Task对应的Job配置信息,还可以方便TaskTracker监控该Task实例所在的JVM的状态。该Child创建时,会创建一个到TaskTracker的RPC代理对象,通过该RPC连接向TaskTracker汇报Task执行进度及其状态信息。然后,一切运行Task的基本条件都已经具备,接下来从该Task对应的Job的代码(job.jar)开始加载任务处理类,如果是MapTask则执行MapTask运行的处理流程,如果是ReduceTask则执行ReduceTask的处理流程,最后,断开Task汇报状态的RPc连接,Task运行结束。

启动MapTask过程

在Child类中加载启动Task,如果是MapTask,则执行MapTask对应的处理流程,如下序列图所示:

启动一个MapTask运行,包含4个阶段,我们通过运行各个阶段的方法来表示:

  • runJobCleanupTask():清理Job对应的相关目录和文件
  • runJobSetupTask():创建Job运行所需要的相关目录和文件
  • runTaskCleanupTask():清理一个Task对应的工作目录下与Task相关的目录或文件
  • runNewMapper()/runOldMapper():调用用户编写的MapReduce程序中的Mapper中的处理逻辑

在MapTask运行过程中, 如果阶段或者状态发生变化,要与TaskTracker进行通信,汇报状态,并更新TaskTracker维护的关于Task和Job对应的状态数据。最后,Task运行完成,也要通知TaskTracker。

启动ReduceTask过程

在Child类中加载启动Task,如果是ReduceTask,则执行ReduceTask对应的处理流程,如下序列图所示:

启动一个ReduceTask运行,与MapTask的处理流程有很大的不同,它包含3个阶段,如下所示:

  • copy阶段:从运行MapTask的TaskTracker节点,拷贝属于该ReduceTask对应的Job所包含的MapTask的输出中间结果数据,这些数据存储在该Reduce所在TaskTracker的本地文件系统(可能会放在内存中),为后续阶段准备数据
  • sort阶段:对从MapTask拉取过来的数据进行合并、排序
  • reduce阶段:调用用户编写的MapReduce程序中的Reducer中的处理逻辑

执行reduce阶段,比MapTask复杂的多。在ReduceTask运行过程中,也会周期性地与TaskTracker通信,汇报Task运行进度和状态,以保证与TaskTracker所维护的Task的状态数据同步。当ReduceTask完成后,如果有输出的话,最终的结果数据会输出到HDFS中保存。[原创:时延军(包含链接:http://shiyanjun.cn)]

觉得文章不错的话,可以转发关注小编一手,之后持续更新干货文章!!

相关推荐

5分钟调色大片的方法(5分钟调色大片的方法有哪些)

哈喽大家好。在大家印象中一定觉得ps非常难学非常难。大家不要着急,小编的教学都是针对ps零基础的同学的,而且非常实用哦。只要大家跟着图文练习一两遍,保证大家立马学会~!好了,废话少说,下面开始我们今天...

闪白特效原来是这么用的(闪白特效怎么使用)

作者|高艳侠订阅|010-86092062闪白特效是影视作品中应用比较多的效果之一,那么具体该在哪些场景使用闪白特效?具体该如何操作?下面就以AdobePremiere(以下简称PR)为例,...

ppt常用小图标去哪里找?3个矢量素材网站推荐!

ppt是一个注重可视化表达的演示载体,除了高清图片,ppt中另一类常用的素材是各种小图标,也叫矢量图标,巧妙运用小图标能提升整体美观度和表现力,那么ppt常用小图标去哪里找呢?为方便各位快速找到合适的...

有什么好用的截图录屏工具?试试这9款

经常有朋友反馈苦于缺乏截屏和录屏的趁手工具,本期我们分享几个相当好用的截屏和录屏工具,希望能帮到大家。ScreenToGifScreenToGif是一款免费且开源的录屏工具。此款工具最大的特点是可以...

配色苦手福音!专业快速色环配色PS插件

今天橘子老师给的大家介绍的是一款快速配色的插件,非常强大配色苦手福音来啦!(获取方式见文末)【插件介绍】配色在后期设计中占有主导地位,好的配色能让作品更加抢眼Coolorus这款专业的配色插件,能够...

如何用PS抠主体?(ps怎么抠主体)

1.主体法抠图-抠花苞和花梗导入一张荷花苞的照片,点击上图中顶部“选择”菜单栏,下拉单击“主体”。可以看到,只有花苞被选中,但是花梗并没有被选中。接下来单击上图中左侧工具栏的“快速选择工具”,上图中顶...

2799元的4K电视,有保障吗?(买4k电视机哪个品牌好)

在上一期《电脑报》的3·15专题报道中,我们揭露了一款不靠谱的42英寸4K智能电视——TCLD42A561U。这款售价2699元的4K智能电视不仅4K画质方面存在严重问题,而且各种功能和应用体验也不理...

苹果电脑的Touch Bar推出一段时间了 这款工具可以帮你开发适用于它的APP

距离苹果推出带有TouchBar的MacBookPro已经有一段时间了,除了那些像Adobe、Google和Microsoft大公司在开发适用于TouchBar的应用之外,其实还有很多独立的开...

如魔法般吸取颜色的桌灯(如魔法般吸取颜色的桌灯叫什么)

色彩为生活带来的感官刺激,逐渐被视为理所当然。一盏桌灯运用它的神奇力量,将隐藏于物件中的颜色逐一释放,成为装点环境的空间魔法师。ColorUp是一款可以改变颜色的吸色台灯,沿用传统灯泡的造型,融入了拾...

一篇文章带你用jquery mobile设计颜色拾取器

【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...

ps拾色器快捷键是什么?(ps2019拾色器快捷键)

ps拾色器快捷键是什么?文章末尾有获取方式,按照以下步骤就能自动获得!学会制作PS特效需要一定程度的耐心和毅力。初学者可以从基本的工具和技术开始学习,逐渐提高他们的技能水平。同时,观看更多优秀的特效作...

免费开源的 Windows 截图录屏工具,支持 OCR 识别和滚动截图等

功能很强大、安装很小巧的免费截图、录屏工具,提供很多使用的工具来帮我么能解决问题,推荐给大家。关于ShareXShareX是一款免费的windows工具,起初是一个小巧的截图工具,经过多年的迭...

入门到精通系列PS教程:第13篇 · 拾色器、颜色问题说明及补充

入门到精通系列PS教程:第13篇·拾色器、颜色问题说明及补充作者|侯潇问题说明我的第12篇教程里,有个小问题没有说清楚。要说是错误,又不算是错误,只是没有说准确。写完那篇教程后,因为已经到了深...

PS冷知识:用吸管工具吸取屏幕上的任意颜色

今天,我们给大家介绍PS中的一个冷知识:用吸管工具可以吸取屏幕上的任意颜色。其实,操作起来是非常简单的。大多数情况下,我们认为,PS的吸管工具只能吸取PS软件作图区域范围内的颜色,最多加上画布四周的...

Windows 11 将提供内置颜色选择器工具

Windows11内置了颜色选择器,可以扫描并识别屏幕上的颜色并生成颜色代码。此外,微软还利用人工智能技术,让屏幕上的文本扫描和选择变得更加便捷。这两项功能均已在SnippingToolv1...