Hadoop MapReduce体系和生命周期

MapReduce是一个分布式计算框架,主要由:编程模型和运行时环境组成

 

MapReduce采用Master/Slave架构:

  

主要由以下部分组成:

  1 Client: 用户编写MapReduce程序通过Client提交到JobTracker,也能通过Client查看作业运行状态

  2 JobTracker:负责资源监控和作业调度

    监控所有TaskTracker与作业的健康状况,一旦发现失败,将相应的任务转移到其他节点

    跟踪任务的执行进度、资源使用量等信息,告诉任务调度器(Task Scheduler)

    任务调度器选择合适的任务使用这些资源

    在hadoop中,任务调度器是一个可插拔的模块,用户可以自己设计

  3 TaskTracker

    TaskTracker会周期性地通过Heartbeat将本节点上资源的使用情况和任务的运行进度汇报给JobTracker

    同时接受JobTracker发送过来的命令并执行相应的操作

    TaskTracker使用“slot”等量划分本节点上的资源量。slot代表计算资源(CPU、内存等)

    一个Task获取到一个slot后才有机会运行

    slot分为Map slot和Reduce slot两种,分别供MapTask和ReduceTask使用

    TaskTracker通过slot数目限定Task的并发度

  4 Task

    分为MapTask和ReduceTask两种,

    对于MapReduce而言,其处理单位是split,split是一个逻辑概念,只包含一些元数据信息,如数据起始位置、长度、节点

    它的划分完全由用户自己决定,split的多少确定了MapTask的数量,一一对应处理

    MapTask处理的临时结果存放到本地磁盘上,被分成若干个partition,每个partition将被一个ReduceTask处理

    ReduceTask处理过程:

      1 从远程节点上读取MapTask中间结果

      2 按照key对key/value进行排序

      3 调用用户自定义的reduce()函数处理,将结果存在HDFS上

 

MapReduce作业生命周期:

  1 作业提交与初始化。

    用户提交作业后,由JobClient实例将作业相关信息上传到分布式文件系统,然后通过RPC通知JobTracker

    JobTracker收到新作业提交请求后,由作业调度模块对作业进行初始化

    为作业创建一个JobInProgress对象以跟踪作业运行状况

    而JobInProgress会为每个Task创建一个TaskInProgress对象以跟踪每个任务的运行状态

    TaskInProgress可能需要管理多个"Task Attempt"

  2 任务调度与监控。

    均有JobTracker完成。

    一旦出现空闲资源,JobTracker会按照一定的策略选择一个合适的任务使用该资源,这由任务调度器完成

    任务调度器是一个可插拔的独立模块,为双层架构,先选择作业,后从作业中选择任务,重点考虑数据本地性

    当TaskTracker或Task失败时,转移计算任务

    当某个Task执行进度落后于同一作业的其他Task时,启动一个相同的Task,选择快的Task结果

  3 任务运行环境准备。

    包括JVM启动和资源隔离,均由TaskTracker实现

    TaskTracker为每个Task启动一个独立的JVM以避免不同Task在运行过程中互相影响

    Task使用了操作系统进程实现资源隔离以防止Task滥用资源

  4 任务执行。

    TaskTracker为Task准备好运行环境后,便会启动Task

    在运行过程中,每个Task的最新进度首先由Task通过RPC汇报给TaskTracker,再由TaskTracker汇报给JobTracker

  5 作业完成

    待所有Task执行完成后,整个作业执行成功

 

作业的提交:

  jobClient的runJob()

    1 新建JobClient实例

    2 调用submitJob()方法

    3 每秒轮询作业的进度

      * 如果发现自上次报告后有改变,便把进度报告到控制台

      * 作业完成后,如果成功,就显示作业计数器

      * 如果失败,导致作业失败的错误被记录到控制台

  JobClient的submitJob()方法提交过程:

    1 向jobtracker请求一个新的作业ID

    2 检查作业的输出说明

    3 计算作业的输入分片。如果分片无法计算,作业就不提交,错误返回给MapReduce程序

    4 将运行作业所需要的资源复制到一个以作业ID命名的目录下jobtracker的文件系统中,

    5 告知jobtracker作业准备执行(通过调用jobTracker的submitJob()方法实现)

  

作业的初始化

  1 jobTracker接收到对其submitJob()方法的调用

  2 把此调用放到一个内部队列中,交由作业调度器进行调度,并对其进行初始化

  3 初始化包括创建一个表示正在进行作业的对象--封装任务和记录信息,以便跟踪任务的状态和进程

  

任务分配

  1 tasktracker运行一个简单的循环来定期发送“心跳”给jobtracker

  2 “心跳”告知jobtracker,tasktracker是否存活,同时充当两者之间的消息通道

 

任务执行

  1 tasktracker通过从共享文件系统把作业的JAR文件复制到tasktracker所在的文件系统,从而实现作业的JAR文件本地化

     tasktracker将应用程序所需要的全部文件从分布式缓存复制到本地磁盘

  2 tasktracker为任务新建一个本地工作目录,并把JAR文件中的内容解压到这个文件夹下

  3 tasktracker新建一个TaskRunner实例来运行该任务

  4 TaskRunner启动一个新的JVM来运行每个任务

 

 

 

posted @ 2014-04-15 11:08  褐色键盘  阅读(314)  评论(0)    收藏  举报