2.1Mapreduce工作机制
2.1.1提交作业的方式
- 通过一个简单的方法调用来运行MapReduce作业Job对象上的submit(),直接将作业提交到Hadoop平台上
- 调用Job对象上的waitForCompletion()方法,用于用于提交之前没有处理过的作业,等它完成,客户端会时刻打印作业执行的进度信息。(常用)
2.1.2经典的Mapreduce 1运行机制
包含4个独立的实体:
1)Client,提交MapReduce程序到JobTracker
2)JobTracker,负责资源监控和作业调度
3)TaskTackker,执行JobTracker发送的指令,向JobTracker汇报资源使用情况和任务执行进度
4)Task,MapTask解析数据分片并运行map()函数,ReduceTask执行reduce()函数并把结果写入HDFS
Task分为MapTask和ReduceTask 。
- MapTask将对应的分片迭代解析成一个个键值对,依次调用用户自定义的map()函数进行处理,最终将临时结果写道磁盘上。
- ReduceTask执行过程分为三个阶段:
Shuffle阶段 | 第一阶段从远程节点上读取MapTask中间结果 |
Sort阶段 | 第二阶段按照key对key-value进行排序 |
Reduce阶段 | 第三阶段依次读取<key,value list>调用用户自定义的reduce函数,将最终结果写道HDFS上 |
2.1.3Shuffle和排序
Shuffle:将Mapper的输出作为输入传递给Reducer的过程
1.环形缓冲区
每个map任务都有一个环形缓冲区(Buffer),map将输出写到这个环形内存缓冲区,Buffer是内存中一种首尾相连的数据结构,专门用来存储Key-Value格式的数据。大小为100MB。
2.溢出写
默认情况下环形缓冲区的大小是100MB,map将输出不断写入到环形缓冲区中,一旦缓冲区的内容达到阈值的80%时,就会启动后台的一个线程,并开始把环形缓冲区的内容写到本地磁盘上。
在后台线程写入的同时,map会继续将输出数据写入环形缓冲区,如果此时环形缓冲区已经写满,则map会阻塞,直到写入本地磁盘的过程完成,而不会覆盖缓冲区内的已有数据,我们把写入本地磁盘的过程称为溢出写。
3.分区
默认的Partitioner对象通过使用Hash算法来分区。
4.合并Spill文件
当map向环形缓冲区中不断输入时,则会发生环形缓冲区达到溢出写阈值,就会触发溢出写操作,新建一个Spill文件,将Spill文件写入磁盘,因此在map任务写完其最后一个输出记录之后,会有多个Spill文件。在map任务完成之前,这些Spill文件会根据情况合并成一个大的已分区已排序的输出文件。
Shuffle过程的三次排序
1)Shuffle的Map阶段,map函数产生输出时,写入环形缓冲区,当缓冲区达到阀值时写入磁盘;写磁盘前先将缓冲区中的数据划分成分区,每个分区中的数据按键进行内排序,即第一次排序。
2)Shuffle的Map阶段,map任务完成前,磁盘上存在多个溢写文件(分好区、排好序),合并溢写文件生成输出文件,合并时需再做一次排序就可使输出文件整体有序,即第二次排序
3)Shuffle的Reduce阶段,需要将多个Map任务的输出文件合并,合并时需再做一次排序就可以使输出文件整体有序,即第三次排序。
MapReduce 提供的三个调度器:
先进先出调度器、公平调度器、计算能力调度器
2.2YARN平台
2.2.1YARN核心组件及功能
1)ResourceManager(RM),负责所有资源的监控、分配和管理
2)NodeManager(NM),负责每一个节点的维护
3)ApplicationMaster(AM),负责每一个具体应用程序的调度和协调
4)RM拥有控制权和资源分配权,AM和RM协商资源、和NM通信、执行并监控task
NodeManager:定期将本节点上的资源使用情况上报给RM,同时接收来自AM的命令,以及启动/回收Container。
ApplicationMaster只有获得了Container后才能启动相应的map和reduce任务。
一个应用程序所需要的Container分为两大类:
- 一类是可以运行ApplicationMaster的Container,它是由RM向内部的资源调度器申请,用户提交应用程序时,可指定唯一的ApplicationMaster所需要的资源;
- 另一类是运行各类任务的Container,它由ApplicationMaster向RM申请,并通过ApplicationMaster与NM通信来启动。
概述流程:
用户将应用程序提交到RM上,RM为应用程序申请资源,并于某个NM通信,以启动AM。之后AM与RM通信为内部要执行的任务申请资源,得到资源后和NM通信,以启动对应的任务。当所有的任务完成之后,AM向RM注销,整个应用程序结束。