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