大数据常见面试题之MapReduce

一.MapReduce的执行流程

MR的整体执行流程:(Yarn模式)

  • 1.在MapReduce程序读取文件的输入目录上存放相应的文件。
  • 2.客户端程序在submit()方法执行前,获取待处理的数据信息,然后根据集群中的参数的配置形成一个任务分配规划。
  • 3.客户端提交切片信息给Yarn,Yarn中的resourcemanager启动
  • 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的过程也就结束的,后面进入reducemask的逻辑运算过程(从文件中取出一个一个的键值对group,调用用户自定义的reduce()方法)。
  • 9.MRAPPmaster监控到所有的maptask进程任务完成后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据分区。
  • 10.reducetask进程启动后,根据MRAPPmaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取若干个maptask输出结果文件,并在本地进行重新归并排序,然后按照相同key的KV为一个组,调用客户定义的reduce()方法进行逻辑运算。
  • 11.reducetask运算完毕后,调用客户指定的outputformat将结果数据输出到外部。

二.MapReduce写过吗?有哪些关键类?mapper的方法有哪些?setup方法是干嘛的?它是每读一行数据就调用一次这个方法吗?

1.关键类

• GenericOptionParser是为Hadoop框架解析命令行参数的工具类。
• InputFormat接口,它的实现类包括:Fileinputfotmat,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方法。

三.有个需求,要求一条指令可以把所有文件都shuffle到同一partition中,用MapReduce的话,你怎么写?

  • 在Driver驱动类中设置reduce数量,job.setNumReduceTask(1)为1。

四.Hadoop Shuffle原理(越详细越好)?

  • 1.map方法之后reduce方法之前这段处理过程叫Shuffle。
  • 2.map方法之后,数据首先进入到分区方法,把数据标记好分区,然后把数据发送到环形缓冲区;环形缓冲区默认大小100M,环形缓冲区达到80%时,进行溢写;溢写前对数据进行排序,排序按照对key的索引进行字典顺序排序,排序的手段快排;溢写产生大量溢写文件,需要对溢写文件进行归并排序;对溢写的文件也可以进行Combiner操作,前提是汇总操作,求平均值不行。最后将文件按照分区存储到磁盘,等待Reduce端拉取。
  • 3.每个Reduce拉取Map端对应分区的数据。拉取数据后先存储到内存中,内存不够了,再存储到磁盘。拉取完所有数据后,采用归并排序将内存和磁盘中的数据都进行排序。在进入reduce方法前,可以对数据进行分组操作。

相关细节如下:

  • 1.maptask执行,收集maptask的输出数据,将数据写入环形缓冲区中,记录起始偏移量。
  • 2.环形缓冲区默认大小为100M,当数据达到80M时,记录终止偏移量。
  • 3.将数据进行分区(默认分组根据key的hash值%reduce数量进行分区),分区内进行快速排序。
  • 4.分区,排序结束后,将数据刷写到磁盘(这个过程中,输出的数据写入剩余20%环形缓冲区,同样需要记录起始偏移量)。
  • 5.maptask结束后将形成的多个小文件做归并排序合并成一个大文件。
  • 6.当有一个maptask执行完成后,reducetask启动。
  • 7.reducetask到运行完成maptask的机器上拉取属于自己分区的数据。
  • 8.reducetask将拉取过来的数据“分组”,每组数据调用一次reduce()方法。
  • 9.执行reduce逻辑,将结果输出到文件。

五.combine函数的作用?

  • comnbine分为map端和reduce端,作用是把同一个key的键值对合并在一起,可以自定义的。combine函数把一个map函数产生的<key,value>对(多个key,value)合并成一个新的<key2,value2>。将新的<key2,value2>作为输入到reduce函数中。这个value2亦可称之为values,因为有多个。这个合并的母大是为了减少网络传输。

六.简列几条MapReduce的调优方法

MapReduce优化方法主要从六个方面考虑:数据输入,Map阶段,Reduce阶段,IO传输,数据倾斜问题和常用的调优参数。

1.数据输入

  • 1)合并小文件,在执行MR任务前将小文件进行合并,大量的小文件会产生大量的map任务,增大map任务装载次数,而任务的装载比较耗时,从而导致MR运行较慢;
  • 2)采用combinetextinputformat来作为输入,解决输入端大量小文件的场景。

2.Map阶段

  • 1)减少溢写次数,通过调整io.sort.mb及sort.spill.percent参数值,增大出发溢写的内存上限,减少溢写次数,从而减少磁盘IO;
  • 2)减少合并次数,通过调整io.sort.factor参数,增大merge的文件数目,减少merge的次数,从而缩减MR处理时间;
  • 3)在map之后,不影响业务逻辑的前提下,先进行combine处理,减少IO。

3.Reduce阶段

  • 1)合理设置map和reduce的数量,两个数量都不能太少或者太多,太少,会导致task等待时间太长,延长处理时间,太多,会导致map和reduce任务之间竞争资源,造成处理超时等错误;
  • 2)设置map和reduce共存,调整,show start completedmaps参数,使map运行到一定程度后,reduce也开始运行,从而减少reduce等待时间;
  • 3)规避使用reduce,因为reduce在用于连接数据集的时候会产生大量的网络消耗;
  • 4)合理设置reduce端的buffer,可以通过设置参数来配置,使得buffer中的一部分数据可以直接输送到reduce,从而减少IO开销;MapReduce,Reduce.input.buffer.percent的默认为0.0,当值大于0时,会保留在指定比例的内存读buffer中的数据直接拿给reduce使用。

4.IO传输

  • 1)采用数据压缩的方式,减少任务的IO时间;
  • 2)使用seq二进制文件。

七.Hadoop中有哪几个进程,各自的作用是什么?

  • NameNode,管理文件系统的元数据的存储,记录文件中各个数据块的位置信息,负责执行有关文件系统的命名空间的操作,如打开,关闭,重命名文件和目录等,一个HDFS集群只有一个活跃的namenode,可以有其他从元数据节点
  • Secondarynamenode,合并namenode的edit logs到fsimage文件中辅助namenode将内存中的元数据信息持久化
  • NodeManager,是YARN中每个节点上的代理,它管理Hadoop集群中单个计算节点包括与ResourceManager保持通信,监督Container的生命周期管理,监控每个Container的资源使用(内存,CPU等)情况,追踪节点健康状况,管理日志和不同应用程序用到的附属服务(auxiliary service)
  • DataNode,数据存储节点,保存和检索Block(文件块)负责提供来自文件系统客户端的读写请求,执行块的创建,删除等操作
  • ResourceManager,在YARN中,ResourceManager负责集群中所有资源的统一管理和分配,它接收来自各个节点(NodeManager)的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManger)RM与每个节点的NodeManager(NMs)和每个应用的ApplicationMaster(AMs)一起工作。

八.Yarn的job提交流程

在这里插入图片描述

1.作业提交

  • 1)client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
  • 2)client向ResourceManager申请一个作业id。
  • 3)ResourceManager给Client返回该job资源的提交路径(HDFS路径)和作业id,每一个作业都有一个唯一的id。
  • 4)Client发送jar包,切片信息和配置文件到指定的资源提交路径。
  • 5)Client提交完资源后,向ResourceManager申请运行MrAppMaster(针对job的ApplicationMaster)。

2.作业初始化

  • 6)当ResourceManager收到Client的请求后,将该job添加到容量调度器(Resource Scheduler)中。
  • 7)某一个空闲的NodeManager领取到该job。
  • 8)该NodeManager创建Container,并产生MrAppMaster。++++++++++
  • 9)下载Client提交的资源到本地,根据分片信息生成MapTask和ReduceTask。

3.任务分配

  • 10)MrAppMaster向ResourceManager申请运行多个MapTask任务资源。
  • 11)ResourceManager将运行MapTask任务分配给空闲的多个NodeManager,NodeManager分别领取任务并创建容器(Container)。

4.任务运行

  • 12)MrAppMasterMaster向两个接收任务的NodeManager发送程序启动脚本,每个接收到任务的NodeManager启动MapTask,MapTask对数据进行数据处理,并分区排序。
  • 13)MrAppMaster等待所有MapTask运行完毕后,向ResourceManager申请容器(Container),运行ReduceTask。
  • 14)程序进行完毕后,MrAppMaster会向ResourceManager申请注销自己。
  • 15)进度和状态更新。YARN中的任务将其进度和状态(包括counter)返回给应用管理器。客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新,展示给用户。可以使用YARN WebUI查看任务执行状态。

5.作业完成

  • 除了向应用管理器请求作业进度外,客户端每5分钟都会通过waitForCompletion()来检查作业是否完成。时间间隔可以通过
    mapreduce.client.completion.pollinterval来设置。作业完成之后,应用管理器和container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户检查。

九.现块的大小为128M,现在有一文件大小为260M,进行spilt的时候,会被分成几片?

  • 2片,1.1的冗余(每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分为一块切片)

十.列举MR中可干预的组件(详细说明各组件的原理,ps:combine)

  • combine:相当于在map端(每个maptask生成的文件)做了一次reduce。
  • partition:分区,默认根据key的hash值%reduce的数量,自定义分区是继承Partitioner类,重写getPartition()分区方法。自定义分区可以有效的解决数据倾斜的问题。
  • group:分组,继承WritableCompatator类,重写compare()方法,自定义分组(就是定义reduce输入的数据分组规则)。
  • sort:排序,继承WritableComoarable类,重写compareTo()方法,根据自定义的排序方法,将reduce的输出结果进行排序。
  • 分片:可调整客户端的blocksize,minSize,maxSize。

十一.分片与分块的区别?

  • 分片是逻辑概念,分片有冗余。
  • 分块是物理概念,是将数据拆分,无冗余。

十二.resourceManager的工作职责?

• 资源调度。
• 资源监视。
• application提交。

十三.NodeManager的工作职责?

  • 主要是节点上的资源管理,启动Container运行task计算,上报资源,container情况给RM和任务处理情况给AM。

十四.简述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。

  • 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分别在各自队列中顺序比较靠前,三个任务就同时执行。
    在这里插入图片描述

3.Fair Scheduler(公平调度器)

  • 1)持多个队列,每个队列可以配置一定的资源,每个队列中的job任务公平共享其所在队列的所有资源。
  • 2)队列中的job任务都是按照优先级分配资源,优先级越高分配的资源越多,但是为了确保公平每个job任务都会分配到资源。优先级是根据每个job任务的理想获取资源量减去实际获取资源类的差值决定的,差值越大优先级越高。
    在这里插入图片描述

十五.开发job时,是否可以去掉reduce阶段

  • 可以,设置reduce数为0即可job.setNumReduceTask=0

猜你喜欢

转载自blog.csdn.net/sun_0128/article/details/108564793