Hadoop-Mapreduce的框架组成和运行流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qichangjian/article/details/87951405

1.MapReduce的框架组成

在这里插入图片描述
在这里插入图片描述
MapReduce 角色:
Client:作业提交发起者

配置参数Configuration,并打包成jar文件存储在HDFS上,将文件路径提交给JobTracker的master服务,
然后由master创建每个task将它们分发到各个TaskTracker服务中去执行。

JobTracker:初始化作业,分配作业,与TaskTracker通信,协调整个作业

这是一个master服务,程序启动后,JobTracker负责资源监控和作业调度。JobTracker监控所有的TaskTracker和job的健康状况,一旦发生失败,即将之转移到其他节点上,同时JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。在Hadoop 中,任务调度器是一个可插拔的模块,用户可以根据自己的需要设计相应的调度器。

TaskTracker: 保持JobTracker通信,在分配的数据片段上执行MapReduce任务

运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信接受作业,并负责直接执行每个任务。
TaskTracker 会周期性地通过Heartbeat 将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。
TaskTracker 使用“slot”等量划分本节点上的资源量。“slot”代表计算资源(CPU、内存等)。
一个Task 获取到一个slot 后才有机会运行,而Hadoop 调度器的作用就是将各个TaskTracker 上的空闲slot 分配给Task 使用。
slot 分为Map slot 和Reduce slot 两种,分别供MapTask 和Reduce Task 使用。TaskTracker 通过slot 数目(可配置参数)限定Task 的并发度。

TaskScheduler:任务调度器

TaskScheduler任务调度器的理解
TaskScheduler,顾名思义,就是MapReduce中的任务调度器。在MapReduce中,JobTracker接收JobClient提交的Job,
将它们按InputFormat的划分以及其他相关配置,生成若干个Map和Reduce任务。
然后,当一个TaskTracker通过心跳告知JobTracker自己还有空闲的任务Slot时,JobTracker就会向其分派任务。
具体应该分派一些什么样的任务给这台TaskTracker,这就是TaskScheduler所需要考虑的事情。

TaskScheduler工作在JobTracker上。在JobTracker启动时,根据配置“mapred.jobtracker.taskScheduler”选定一个TaskScheduler的派生类实例作为任务调度器。
任务的分派配由JobTracker的调度框架和TaskScheduler的具体调度策略配合完成。简单来说:
1、JobTracker通过一种Listener机制,将Job的变化情况同步给TaskScheduler。然后TaskScheduler就按照自己的策略将需要调度的Job管理起来;
2、在JobTracker需要向TaskTracker分派任务时,调用TaskScheduler的assignTask()方法来获得应当分派的任务;

HDFS:保存数据和配置信息
Heartbeat:心跳(指按照一定的频率在运行,类似于心脏无休止的跳动)机制

2.MapReduce运行流程

在这里插入图片描述

作业运行流程详解:

  • 在客户端启动一个作业,并向JobTracker请求一个Job ID。
  • 然后检查输出说明(如输出目录已存在)、输出划分(如输入路径不存在);
    详细理解就是:将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息。这些文件都存放在JobTracker专门为该作业创建的文件夹中。文件夹名为该作业的Job ID。JAR文件默认会有10个副本(mapred.submit.replication属性控制);输入划分信息告诉了JobTracker应该为这个作业启动多少个map任务等信息。
  • JobTracker接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度(这里是不是很像微机中的进程调度呢,呵呵),当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一个map任务,并将map任务分配给TaskTracker执行。对于map和reduce任务,TaskTracker根据主机核的数量和内存的大小有固定数量的map槽和reduce槽。
    这里需要强调的是:map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Local)。意思是:将map任务分配给含有该map处理的数据块的TaskTracker上,同时将程序JAR包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”。而分配reduce任务时并不考虑数据本地化。
  • TaskTracker每隔一段时间会给JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着很多的信息,比如当前map任务完成的进度等信息。
    当JobTracker收到作业的最后一个任务完成信息的通知时,JobTracker便把整个Job(作业)状态设置成“成功”。当JobClient查询Job运行状态时(注意:这里是异步操作),客户端将得知任务已完成,便显示一条消息给用户。

3.MapReduce调度器

mr其他参考博文调度器

http://blog.sina.com.cn/s/blog_3fe961ae01019ijc.html

猜你喜欢

转载自blog.csdn.net/qichangjian/article/details/87951405
今日推荐