浅入深出MapReduce(HadoopV1.0)

668 阅读4分钟

Hadoop在V2.0版本以后作业调度已经ON YARN了,Hadoop ON YARN

总览

Hadoop MapReduce是一个软件框架,可以轻松地编写应用程序,以可靠,容错的方式并行处理大型硬件集群(数千个节点)上的大量数据(多TB数据集)。

通常,计算节点和存储节点是相同的,也就是说,MapReduce框架和Hadoop分布式文件系统(请参阅HDFS体系结构指南)在同一组节点上运行。此配置使框架可以在已经存在数据的节点上有效地调度任务,从而在整个群集中产生很高的聚合带宽。

MapReduce框架由一个主资源管理器(ResourceManager),每个群集节点一个工作器NodeManager和每个应用程序MRAppMaster组成。

以跑词频统计job为例(概念图)

  • Input:文本文件输入
  • Split:文件切块分片
  • Map:Maping分别统计该分片job中单词出现的次数
  • shuffle:通过网络传输汇总每个分片每台机器统计的结果
  • Reduce:统计单词总共出现的个数
  • Output:输出

工作原理

1、在客户端启动一个作业

2、JobClient通过RPC协议向JobTracker请求一个用于MapReduce的JobID(部署Yarn后可以可视化id及作业)。

3、JobClient将作业所需的资源(包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息)复制到HDFS上。这些文件都存放在JobTracker为该作业创建的文件夹中。文件夹名为该作业的JobID。输入划分信息告诉JobTracker应该为这个作业启动多少个map任务等信息。

4-5、JobClient通过submitApplication()提交作业。JobTracker接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度。当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一个map任务,并将map任务分配给TaskTracker执行。(map任务会分配给含有该map处理的数据块的TaskTracker上,专业名词为:数据本地化。)

6、JobTracker读取HDFS上的要处理的文件,开始计算输入分片,每一个分片(block)对应一个TaskTracker。

7、TaskTracker通过心跳机制领取任务。(TaskTracker每隔一段时间会给JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着很多的信息,比如待领取的任务以及当前map任务完成的进度等信息。当JobTracker收到作业的最后一个任务完成信息时,便把该作业设置成“成功”。当JobClient查询状态时,它将得知任务已完成,便显示一条消息给用户。)

8、TaskTracker读取HDFS上的作业资源(JAR包、配置文件等)

9、TaskTracker调度MapperTask或ReducerTask用来执行具体的任务。

模块工作职能

JobTracker

主要负责资源监控管理和作业调度。
①监控所有TaskTracker 与job的健康状况,一旦发现失败,就将相应的任务转移到其他节点;
②同时JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。

TaskTracker

JobTracker与Task之前的桥梁。
①从JobTracker接收并执行各种命令:运行任务、提交任务、Kill任务、重新初始化任务;
②周期性地通过心跳机制,将节点健康情况和资源使用情况、各个任务的进度和状态等汇报给JobTracker。

Task Scheduler

任务调度器(默认FIFO,先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业)。调度算法详情会在文章末尾展开

Map Task

①Map引擎;
②解析每条数据记录,传递给用户编写的map();
③将map()输出数据写入本地磁盘(如果是map-only作业,则直接写入HDFS)。

Reduce Task

①Reduce引擎;
②从Map Task上远程读取输入数据;
③对数据排序;
④将数据按照分组传递给用户编写的reduce()。

任务调度算法

  • FIFO调度器(默认)

  • 公平调度器(CDH默认调度器)

  • 容量调度器

    (1) TaskTracker和JobTracker之间的通信与任务的分配通过心跳机制完成;

    (2) TaskTracker会主动向JobTracker询问是否有作业要做,如果自己可以做,那么就会申请到作业任务,这个任务 可以是Map也可能是Reduce任务;

    (3) TaskTraker分别为每一个Task启动JVM运行任务。(map或reduce任务)在运行过程中,首先会将自己的状态汇报给TaskTracker,然后由TaskTracker汇总告知JobTracker;

    (4) 任务进度是通过计数器来实现的。JobTracker是在接受到最后一个任务运行完成后,才会将作业标志为成功。