特别说明:“红色字体”标题均为高频面试题
MR的整体执行流程: (Yarn 模式)
1. 在MapReduce程序读取文件的输入目录上存放相应的文件。
2.客户端程序在submit()方法执行前,获取待处理的数据信息,然后根据集群中的参数的配置形成一个任务分配规划。
3.客 户端提交切片信息给Yarn, Yarn 中的resourcemanager启动MRAPPmaster。
4.MrAPPmaster启动后根据本次job的描述信息,计算出需要的maptask实例对象,然后向集群申请机器启动相应数量的maptask进程。
5. Maptask 利用客户端指定的inputformat来读取数据,形成输出的KV键值对。
6. Maptask 将输入KV键值对传递给客户定义的map ()方法,做逻辑运算。
7. Map ()方法运算完毕后将KV对收集到maptask缓存。
8. shuffle阶段:
(1) maptask 收集我们的map ()方法输出的KV对,放到环形缓存区中。
(2) maptask 中的KV对按照K分区排序,并不断溢写到本地磁盘文件,可能会溢出多个文件。
(3)多个文件会被合并成大的溢出文件。
(4)在溢写过程中,及合并过程中,都会不停的进行分区和针对key的排序操作。
(5) Reducetask 根据自己的分区号,去各个maptask机器上获取相应的结果分区数据。
(6) Reducetask会取到同-一个分区的来自不同maptask 的结果文件,reducetask 会将这些文件再进行归并排序。
(7)合并成大文件后,shuffle的过程也就结束的,后面进入reducetask的逻辑运算过程(从文件中取出一一个一个的键值对group,调用用户自定义的reduce ()方法)。
9. MrAPPmaster 监控到所有的maptask进程任务完成后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据分区。
10. reducetask 进程启动后,根据MrAPPmaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取若干个maptask输出结果文件,并在本地进行重新归并排序,然后按照相同key的KV为-一个组,调用客户定义的reduce)方法进行逻辑运算。
11. reducetask 运算完毕后,调用客户指定的outputformat将结果数据输出到外部。
【面试指导&技巧】
MR的执行流程基本上是-一个必问的问题。所以该问题必须掌握。
建议通过画图的方式,进行理解记忆。
需要能够回答出整体流程以及其中的细节,回答出其中的关键步骤、Shuffle机制等。
1.关键类
➢ GenericOptionsParser是为Hadoop框架解析命令行参数的工具类。
➢ InputFormat接口,他的实现类包括, Fileinputformat 、Composable inputformat 等,主要用于文件为输入及切割。
➢ Mapper将输入的kv对映射成中间数据kv对集合。Maps将输入记录转变为中间记录。
➢ Reducer根据key将中间数据集合处理合并为更小的数据结果集。
➢ Partitioner对数据按照key进行分区。
➢ OutputCollector文件的输出。
➢ Combiner本地聚合,本地化的reduce。
2.mapper的方法有setup,map,cleanup,run
➢ setup方法用于管理mapper生命周期中的资源,加载一些初始化的工作, 每个job 执行一次,setup在完成mapper构造,即将开始执行map动作前执行。
➢ map方法,主要逻辑编写方法。
➢ cleanup方法,主要做一些收尾工作,如关闭文件或者执行map ()后的键值分发.等,每个job执行一- 次,比较适合来算全局最大值之类的任务。
➢ run方法执行了上面描述的所有过程,先调用setup方法,然后执行map方法,最后执行cleanup方法。
【面试指导&技巧】
需要能够回答出一一些关键的类,关键的方法。-般自己独立写过MapReduce,都会大致记得这些类和方法。所以如果在学习的时候,自己独立写过MapReduce程序,记住这些类和方法应该很简单。
然后其中一些细节需要能够回答出来。比如setup方法每个job只执行一次。
在Driver 驱动类中设置reduce 数量,job.setNumReduceTasks(1)为 1。
1.map方法之后reduce方法之前这段处理过程叫Shuffle。
2.map方法之后,数据首先进入到分区方法,把数据标记好分区,然后把数据发送到环形缓冲区;环形缓冲区默认大小100m,环形缓冲区达到80%时,进行溢写;溢写前对数据进行排序,排序按照对key的索引进行字典顺序排序,排序的手段快排;溢写产生大量溢写文件,需要对溢写文件进行归并排序;对溢写的文件也可以进行Combiner操作,前提是汇总操作,求平均值不行。最后将文件按照分区存储到磁盘,等待Reduce端拉取。
3.每个Reducer拉取Map端对应分区的数据。拉取数据后先存储到内存中,内存不够了,再存储到磁盘。拉取完所有数据后,采用归并排序将内存和磁盘中的数据都进行排序。在进入Reduce方法前,可以对数据进行分组操作。
相关细节:
1.maptask执行,收集maptask的输出数据,将数据写入环形缓冲区中,记录起始偏移量。
2.环形缓冲区默认大小为100M,当数据达到80M时,记录终止偏移量。
3.将数据进行分区(默认分组根据key的hash值%reduce数量进行分区),分区内进行快速排序。
4.分区、排序结束后,将数据刷写到磁盘(这个过程中,maptask 输出的数据写入剩余20%环形缓冲区,同样需要记录起始偏移量)。
5.maptask结束后将形成的多个小文件做归并排序合并成-一个大文件。
6.当有一个maptask执行完成后,reducetask 启动。
7.reducetask到运行完成maptask的机器上拉取属于自己分区的数据。
8.reducetask将拉取过来的数据“分组”,每组数据调用一次 reduce ()方法。
9.执行reduce逻辑,将结果输出到文件。
【面试指导&技巧】
1.该问题非常重要,需要重点掌握(一般为必问问题)。
2.首先需要回答出map()方法之后,reduce()方法之前为shuffle阶段
3.然后按照相应的顺序,分为map端和Reduce端: map()- >分区>环形缓冲区>排序≥溢写>归并排序>写入磁盘,等待Reduce端拉取。Reudce端: Reduce 端拉取对应分区数据>存储在内存(内存不足,写入磁盘)→拉取完数据,归并排序>对数据进行分组→每组数据调用一次reduce()方法。按照这种顺序去讲解整体的过程。
4.在讲的过程中,需要注意一- 些关键点:相关流程、细节,比如数据什么时候写磁盘,什么时候在内存,什么时候进行什么排序,什么时候进行溢写等。
5.最后讲完流程,如果能再针对如何调优做--些讲解最好(调优的内容可以参考下面调优的问题)
combine分为map端和reduce端,作用是把同一个key的键值对合并在一-起,可以自定义的。combine 函数把一个 map函数产生的
【面试指导&技巧】
此处需要能回答出Combine函数的作用以及目的。
MapReduce优化方法主要从六个方面考虑:数据输入、Map阶段、Reduce 阶段、10 传输、数据倾斜问题和常用的调优参数。
1.数据输入
(1) 合并小文件,在执行MR任务前将小文件进行合并,大量的小文件会产生大量的map任务,增大map任务装载次数,而任务的装载比较耗时,从而导致MR运行较慢;
(2)采用 combinetextinputformat来作为输入,解决输入端大量小文件的场景。
2.Map阶段
(1) 减少溢写次数,通过调整io.sort.mb 及sort.spill.percent 参数值,增大出发溢写的内存上限,减少溢写次数,从而减少磁盘I0;
(2) 减少合并次数,通过调整io.sort.factor参数,增大merge的文件数目,减少merge的次数,从而缩短MR处理时间;
(3) 在map之后,不影响业务逻辑的前提下,先进行combine处理,减少I0。
3.Reduce阶段
(1) 合理设置map和reduce的数量,两个数量都不能太少或者太多,太少,会导致task等待时间太长,延长处理时间,太多,会导致map和reduce任务之间竞争资源,造成处理超时等错误;
(2)设置map和reduce共存,调整,slow start completedmaps参数,使map运行到一定程度后,reduce 也开始运行,从而减少reduce等待时间;
(3)规避使用reduce,因为reduce在用于连接数据集的时候会产生大量的网络消耗;
(4)合理设置reduce端的buffer,可以通过设置参数来配置,使得buffer中的一部分数据可以直接输送到reduce,从而减少I0开销;MapReduce 。Reduce.input.buffer.percent 的默认为0.0,当值大于0时,会保留在指定比例的内存读buffer 中的数据直接拿给reduce 使用。
4.I0传输
(1) 采用数据压缩的方式,减少任务的I0时间;
(2) 使用seq二进制文件。
【面试指导&技巧】
此处需要能回答出几个主要方面的调优手段。不一定能够全部讲出来,针对每一一个阶段,map阶段、reduce阶段等能讲出--些即可。
➢ NameNode,管理文件系统的元数据的存储,记录文件中各个数据块的位置信息,负责执行有关文件系统的命名空间的操作,如打开、关闭、重命名文件和目录等,一个HDFS集群只有-一个活跃的nameNode,可以有其他从元数据节点
➢ Secondarynamenode, 合并nameNode的edit logs到fsimage文件中辅助nameNode将内存中的元数据信息持久化
➢ NodeManager, 是YARN中每个节点上的代理,它管理Hadoop集群中单个计算节点包括与ResourceManger保持通信,监督Container 的生命周期管理,监控每个Container的资源使用(内存、CPU等)情况,追踪节点健康状况,管理日志和不同应用程序用到的附属服务( auxiliary service)
➢ DataNode,数据存储节点,保存和检索Block(文件块)负责提供来自文件系统客户端的读写请求,执行块的创建、删除等操作
➢ ResourceManager, 在YARN中,ResourceManager 负责集群中所有资源的统一管理和分配,它接收来自各个节点( NodeManager)的资源汇:报信息,并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManager) RM与每个节点的NodeManagers (NMs)和每个应用的ApplicationMasters (AMs)一起 工作。
【面试指导&技巧】
问题比较基础。理解掌握即可。
1.作业提交
(1) client 调用job.waitForCompletion 方法,向整个集群提交MapReduce作业。
(2) client 向ResourceManager申请-个作业ld。
(3) ResourceManager 给Client 返回该job资源的提交路径(HDFS 路径)和作业ld,每一个作业都有-一个唯一的 ld。
(4)Client发送jar包、切片信息和配置文件到指定的资源提交路径。
(5) Client 提交完资源后,向ResourceManager申请运行MrAppMaster (针对该job的ApplicationMaster)。
2.作业初始化
(6)当ResourceManager收到Client的请求后,将该job添加到容量调度器( ResouceScheduler)中。
(7)某一个空闲的NodeManager领取到该job。
(8)该NodeManager创建Container,并产生MrAppMaster。
(9)下载Client提交的资源到本地,根据分片信息生成MapTask和ReduceTask。
3.任务分配
(10) MrAppMaster向ResouceManager申请运行多个MapTask任务资源。
(11 ) ResourceManager 将运行MapTask 任务分配给空闲的多个NodeManager ,NodeManager分别领取任务并创建容器( Container)c
4.任务运行
(12) MrAppMaster 向两个接收到任务的NodeManager发送程序启动脚本,每个接收到任务的NodeManager启动MapTask, MapTask 对数据进行处理,并分区排序。
(13) MrAppMaster 等待所有MapTask 运行完毕后,向ResourceManager 申请容器(Container),运行ReduceTask。
(14)程序运行完毕后,MrAppMaster 会向ResourceManager申请注销自己。
(15)进度和状态更新。YARN 中的任务将其进度和状态(包括counter)返回给应用管理器,客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新,展示给用户。可以使用YARNWebUI查看任务执行状态。
5.作业完成
除了向应用管理器请求作业进度外,客户端每5分钟都会通过调用waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval 来设置。作业完成之后,应用管理器和container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
【面试指导&技巧】
Yarn的执行流程面试问的也比较多。和Hadoop的读写流程类似,回答此类流程的问题,一般分等级。
➢ 最基础的, 需要能够答出大致的流程,即各个角色所起的作用,以及各个角色之间的相互关系。可以不用深入细节。
➢ 更进一步的, 能够回答出其中的一.些细节。
➢ 再进一步的,能够讲的条理清洗,能够通过画图完整讲出来,让面试官很轻松听懂。你在讲什么,非常关键。
2片,1.1 的冗余(每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分为一块切片)
【面试指导&技巧】
注意到这个细节就可。文件切片时不是完全的按128M划分的。
➢ combine:相当于在map端(每个maptask生成的文件)做了一次reduce。
➢ partition: 分区,默认根据key 的hash 值%reduce 的数量,自定义分区是继承Partitioner类,重写getPartition ()分区方法。自定义分区可以有效的解决数据倾斜的问题。
➢group:分组,继承WritableComparator类,重写compare()方法,自定义分组(就是定义reduce输入的数据分组规则)。
➢ sort:排序,继承WritableComparable类,重写compareTo()方法,根据自定义的排序方法,将reduce的输出结果进行排序。
➢ 分片: 可调整客户端的blocksize, minSize, maxSize。
【面试指导&技巧】
MR中的一些步骤问题。需要掌握。该问题主要是考察,在MR的执行过程中,哪些步骤可以自定义实现。
➢ 分片是逻辑概念,分片有冗余。
➢ 分块是物理概念,是将数据拆分,无冗余。
➢ 资源调度。
➢ 资源监视。
➢ application 提交。
主要是节点上的资源管理,启动Container运行task 计算,上报 资源、container 情况给RM和任务处理情况给AM。
目前Hadoop有三种比较流行的资源调度器: FIFO、 Capacity Scheduler、Fair Scheduler。目前Hadoop2.7默认使用的是Capacity Scheduler容量调度器。
1.FIFO (先入先出调度器)
Hadoop1.x使用的默认调度器就是FIFO。FIFO 采用队列方式将一个-一个job任务按照时间先后顺序进行服务。比如排在最前面的job需要若干maptask和若干reducetask,当发现有空闲的服务器节点就分配给这个job,直到job执行完毕。
2.Capacity Scheduler (容量调度器)
hadoop2.x使用的默认调度器是Capacity Scheduler。
1.支持多个队列,每个队列可配置一定量的资源, 每个采用FIFO的方式调度。
2.为了防止同一个用户的job任务独占队列中的资源,调度器会对同一用户提交的job任务所占资源进行限制。
3.分配新的job任务时,首先计算每个队列中正在运行task 个数与其队列应该分配的资源量做比值,然后选择比值最小的队列。比如如图队列A15个task,20%资源量, 那么就是15%0.2=70,队列B是25%0.5=50,队列C是25%0.3=80.33。所以选择最小值队列B。
4.其次,按照job任务的优先级和时间顺序,同时要考虑到用户的资源量和内存的限制,对队列中的job任务进行排序执行。
5.多个队列同时按照任务队列内的先后顺序一次执行。例如下图中job11、job21、job31分别在各自队列中顺序比较靠前,三个任务就同时执行。
1.持多个队列,每个队列可以配置一定的资源,每个队列中的job任务公平共享其所在队列的所有资源。
2.队列中的job任务都是按照优先级分配资源,优先级越高分配的资源越多,但是为了确保公平每个job任务都会分配到资源。优先级是根据每个job任务的理想获取资源量减去实际获取资源量的差值决定的,差值越大优先级越高。
【面试指导&技巧】
需要能够回答出Hadoop的几种调度器,每种调度器的特点,以及Hadoop2.x默认使用的调度器。
可以。设置reduce数为0即可。
【面试指导&技巧】
考察MR中哪些阶段不是必须的。
未来可期,加油!