作业在运行时,数据或者是作业调用的一个运行图.

    

  用户写的代码通过JobClient提交给JobTracker
  Job对象中封装了JobClient
  JobConf和我们的Job对象几乎是一回事.
  把我们的代码打包成jar包,上传到hdfs中,JobClient就会获得一个jar包在hdfs中的一个路径.它会把我们jar包的一个路径告诉我们的JobTracker,告诉JobTracker之后,就为jar添加一个新的Job对象,job对象就会使用一个类,JobInProgress类进行跟踪,Job对象中里边有Mapper和Reducer任务,Mapper是map任务,Reducer是reduce任务,在运行时也需要关注这些map任务和reduce任务,所以我们JobTracker这,JobInProgress里边又创建几个TaskInProgress来跟踪我们的map任务或reduce任务,刚开始之后需要创建这个任务,创建这个任务JobTracker是不会干的,会把这个信息交给TaskTracker来执行,在TaskTracker这边启用一个TaskRunner这个类创建我们的这个Task(有可能是map任务,也有可能是reduce任务),并且去运行,这个Task到底是什么任务在我们这个程序中是不重要的.
  TaskRunner去创建一个子进程createChild,根据传过来的是map任务或者是reduce任务,去创建Map任务或者是reduce任务.首先会创建MapTask,在创建任务之前首先要找到这个代码的定义,我们的代码的定义在hdfs上,会把这个jar包给下载下来,根据传过来的TaskInProgress的定义,找到对应的Map任务,然后启动起来,之后就会调用Map方法.Map方法处理的数据,来自hdfs中输入路径,会把这个数据进行处理,转换成新的键值对输出到LocalFS(linux本地),有可能会去执行Combiner(规约),不管归不归约,数据还是会放在linux本地磁盘,Map任务就处理完了.
  处理完Map之后就会启动ReducerTask,Reduce这个任务,就会跑reduce这个程序,reduce会读取map节点上linux本地的这个数据.(Mapper任务和Reducer任务不见得会是同一台机器),reduce然后去处理,处理完之后,写入到hdfs中的目录.
  TaskRunner怎么知道Mapper任务执行完了去执行reducer任务?
    TaskRunner里边的决定权在于JobTracker,JobTracker告诉它,它才会去执行.
  TaskTracker这边会有一个心跳的机制,心跳机制会把我们的TaskTracker这些机器的状态信息都告诉给JobTracker,JobTracker根据这个状态信息做判断,告诉给TaskTracker,去执行.
  我们执行hadoop jar 这个命令时,实际上会把我们的jar包上传到hdfs当中,程序之间的运行,传递的都是jar 地址,在TaskTracker这块,要跑map任务和reducer任务时,解析jar包,找到MyMapper和MyReducer的定义,实例化  MyMapper和MyReducer这个对象,然后去执行其中的Map方法或者是Reducer方法.
  jar包仅仅是类定义的一个文件,作业运行时,是一个动态的,从jar包中找到类定义信息,通过反射机制实例化MyMapper和MyReducer类,然后去调用其中的Map方法和Reducer方法.TaskTracker应该也是把jar下载下来,要不然是找不到类定义信息.我们自己的MyMapper和MyReducer这个类,会被TaskInProgroess这个对象来管理,实际我们MyMapper和MyReducer仅仅是两个类,这两个类,是有共同的基类的.基类是Task,根据是Map或者是Reducer分为MapTask和ReducerTask,我们在这里看到的是MyMapper和MyReducer,实际上程序在运行时,是MapTask类,ReducerTask类.

  JobClient:客户端,JobTracker:服务端,JobTracker和JobClient之间是可以互相通信的,JobSubmissionProtocol相当于我们的客户端与服务端进行调用的接口.方法的调用是在JobClient中的,方法的执行时发生在服务端JobTracker.
  为什么要把jar包放在hdfs上?
    hdfs除了可以存储海量数据,还可以作为共享数据.
  RPC中我们的服务端就叫JobTracker,我们的客户端就是JobClient,之间要进行通信的话还是RPC的这个机制,只不过这个机制在传递的时候访问的这个协议是JobSubmissioonProtocol

    

    从图中可以看出JobClient在我们的job中,而我们的Job是在我们的当前应用中,我们代码中new Job() 实际上也获得一个JobClient.
    JobClient提交作业在我们客户端就是把我们的应用提交过去了,提交应用实际上是先获得一个JobId,然后再把信息写到hdfs中,然后才告结束.
    JobClient就相当于我们的Job对象,因为我们的JobClient是在Job这创建的.Job是在我们java代码中创建的.
    本质就是JobClient客户端调用服务端JobTracker对象中的方法.
    客户端提交作业之后,JobTracker先把我们的作业创建一个JobInProgress对象进行管理,然后把JobInProgress放入调度器中供调用.调度器简单的认为就是一个队列,先进先出的队列,进入这个队列之后就会从这个队列中取出这个对象,然后运行它.运行的方法实际上就是实例化一个它,在和我们的TaskTracker来进行通信,TaskTracker和JobTracker依然采用的是我们的RPC的通信机制,只是我们在JobClient和JobTracker之间通信的话用的是JObSubmissionProtocal,在我们JobTracker和TaskTracker通信的时候用的是InterTrackerProtocol
TaskTracker性质上也属于我们的客户端,如果和我们的JobTracker通信的话,意味着也会有一个协议,就叫做InterTrackerProtocol
    InterTrackerProtocol主要做:heartbeat,周期性被我们的TaskTracker调用,调用了之后去更新我们的任务状态.JobTracker就会返回一个HeartbeatResponse对象,告诉TaskTracker去处理一系列的对象,JobTracker要给TaskTracker分配任务也是使用heartbeat来做的.hearbeat会返回很多的HeartbeatResponse,方法的执行就是在TaskTracker中执行的.发送心跳之后,JobTracker就会知道TaskTracker一切信息.
    加载一个新的任务在图中是说JobTracker委托给TaskTracker去干的.通过心跳机制,我们的JobTracker送给我们的TaskTracker一个LaunchTaskAction这个命令,拿到这个命令之后就会调用addToTaskQueue这个方法放入到队列中,在addToTaskQueue队列中有一个mapLaunch和一个reducerLauncher.
mapLaunch和reducerLauncher实际上是从我们的hdfs中读我们的jar包数据,读我们的map定义和reducer定义.
JobTracker和TaskTracker之间的通信是通过TaskTracker的heartbeat这种周期性的心跳来实现的.
    TaskTracker 发送heartbear是有间隔,有规律的跳动的,
    如果上一次的发送心跳时间加上心跳间隔减去当前时间如果大于0,说明是在心跳生命周期之内,就会去休眠,如果超过这个心跳周期,就不需要休眠,执行下面代码,然后下面的代码就是去发送心跳.
    如果这个间隔小于0,就一个劲的循环不出来,如果超时,就break退出.
    JobTracker和TaskTracker是如何通信?发送心跳.
      TaskTracker会把他自身的一些信息汇报给JobTracker,汇报的方式就是通过心跳机制,它把它自身自身的信息都通过心跳方法heartbeat方法的形参告诉给JobTracker,JobTracker会汇总它的信息,告诉TaskTracker去干什么事,到了TaskTracker之间就会去处理.
    jobTracker如何和hdfs进行通信?
      JObTracker这边使用FileSystem这个类,因为我们在代码提交的时候,我们把jar包的路径,输入文件的路径,以及输出文件的路径都写到我们的这个配置中了,那么我们的JobTracker就拿到配置,在TaskTracker也可以拿到,JobTracker拿到配置信息,就是使用FileSystem去访问HDFS.我们把JobTracker不当成老大,当成hdfs的客户端.JobTracker和我们的TaskTracker和    我们的其他的代码都是我们的hdfs的客户端.
    TaskRunner是一个线程,基类,在一个单独的进程中,所以运行任务是在一个独立的进程中,目的是隔离map和reduce的系统代码.map和reduce是一个进程.他们之间也没有线程之间的问题.因为他们都是独立的进程,用来隔离这些代码的.
    launchJvmAndWait():方法,启动的是进程,加载的是JVM,map任务和reduce任务实际上是一个MapTask和ReduceTask.
程序在运行起来实际上一个叫MapTask,一个叫ReduceTask,他们有一个共同的类,叫做Task类.中含有createRunner,返回一个基类TaskRunner,TaskRunner下边有MapTaskRunner和ReduceTaskRunner.在TaskRunner中有一个方法,执行新的Map任务(runNewMapper)还是执行旧的Map任务(runOldMapper),我们的这个Mapper类要运行的话,实际上是反射实例化这个对象,然后去执行.
    我们写的Mapper方法继承自Mapper类,
    类中的map方法需要我们去实现,这个方法只被调用一次.在这里我们只需要覆盖这个方法,把自己的业务逻辑把我们的代码给写出去的.
      setup(),在我们任务开始的时候会被调用一次.
      cleanup(),在任务结束的时候会被调用一次.在我们整个map任务开始的时候会调用setup(),任务结束的时候会调用cleanup(),在map任务中间会调用map(),类似于javaWeb中的filter.

MapReduce的执行过程.的更多相关文章

  1. MapReduce简单执行过程及Wordcount案例

    MapReducer运行过程 以单词统计为案例. 假如现在文件中存在如下内容: aa bb aa cc dd aa 当然,这是小文件,如果文件大小较大时会将文件进行 "切片" ,此 ...

  2. mapreduce程序执行过程

    1.客户端程序,设置作业相关的配置和计算输入分片信息,向RM获取一个JOBID,提交作业信息(分片)到以作业ID为目录下,通知APP——MASTER 2.APP——MASTER,读取指定目录下的作业信 ...

  3. MapReduce概述,原理,执行过程

    MapReduce概述 MapReduce是一种分布式计算模型,运行时不会在一台机器上运行.hadoop是分布式的,它是运行在很多的TaskTracker之上的. 在我们的TaskTracker上面跑 ...

  4. Hadoop MapReduce执行过程详解(带hadoop例子)

    https://my.oschina.net/itblog/blog/275294 摘要: 本文通过一个例子,详细介绍Hadoop 的 MapReduce过程. 分析MapReduce执行过程 Map ...

  5. 分析MapReduce执行过程

    分析MapReduce执行过程 MapReduce运行的时候,会通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法,处理数据,最后输出. Reducer任务会接收Mapper任务输 ...

  6. Hadoop学习之Mapreduce执行过程详解

    一.MapReduce执行过程 MapReduce运行时,首先通过Map读取HDFS中的数据,然后经过拆分,将每个文件中的每行数据分拆成键值对,最后输出作为Reduce的输入,大体执行流程如下图所示: ...

  7. MapReduce执行过程

    Mapper任务的执行过程: 第一阶段是把输入文件按照一定的标准分片(InputSplit),每个输入片的大小是固定的.默认情况下,输入片(InputSplit)的大小与数据块(Block)的大小是相 ...

  8. 分析MapReduce执行过程+统计单词数例子

    MapReduce 运行的时候,会通过 Mapper 运行的任务读取 HDFS 中的数据文件,然后调用自己的方法,处理数据,最后输出.Reducer 任务会接收 Mapper 任务输出的数据,作为自己 ...

  9. Hadoop mapreduce执行过程涉及api

    资源的申请,分配过程略过,从开始执行开始. mapper阶段: 首先调用默认的PathFilter进行文件过滤,确定哪些输入文件是需要的哪些是不需要的,然后调用inputFormat的getSplit ...

随机推荐

  1. Android:ViewPager制作幻灯片

    布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:androi ...

  2. 关于spring-mvc的InitBinder注解的参数

    关于spring-mvc的InitBinder注解的参数 通过Spring-mvc的@InitBinder注释的方法可以对WebDataBinder做一些初始化操作.比如设置Validator. 我一 ...

  3. idea15 如何设置代码不自动折叠

    IDEA默认情况下,如果方法体中只有一行,这个方法体会折叠起来,就像这种

  4. java抓取动态生成的网页

    最近在做项目的时候有一个需求:从网页面抓取数据,要求是首先抓取整个网页的html源码(后期更新要使用到).刚开始一看这个简单,然后就稀里哗啦的敲起了代码(在这之前使用过Hadoop平台的分布式爬虫框架 ...

  5. sql 随笔 2015-07-02

    sql 自定义函数 --检查函数是否存在 if exists (select * from dbo.sysobjects where id = object_id(N'dbo.pTitleCase') ...

  6. proc_dir_entry

    struct proc_dir_entry {        unsigned int low_ino;        unsigned short namelen;        const cha ...

  7. Oracle学习之集合运算

    一.集合运算操作符  UNION:(并集)返回两个集合去掉重复值的所有的记录  UNION ALL:(并集)返回两个集合去掉重复值的所有的记录 INTERSECT:(交集)返回两个集合的所有记录,重复 ...

  8. zoj 3778 Talented Chef(思维题)

    题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...

  9. Qt之进程间通信(TCP/IP)

    简述 可以通过Qt提供的IPC使用TCP/IP,使用QtNetwork模块即可实现,TCP/IP在实现应用程序和进程内部通信或与远程进程间的通信方面非常有用. QtNetwork模块提供的类能够创建基 ...

  10. UVa 10943 (数学 递推) How do you add?

    将K个不超过N的非负整数加起来,使它们的和为N,一共有多少种方法. 设d(i, j)表示j个不超过i的非负整数之和为i的方法数. d(i, j) = sum{ d(k, j-1) | 0 ≤ k ≤ ...