大数据知识点梳理-Hadoop生态之MapReduce

1.2 MapReduce

特别说明:“红色字体”标题均为高频面试题

  • 1.2.1 *MR的执行流程?
  • 1.2.2 *MapReduce写过吗?有哪些关键类? mapper 的方法有哪些? setup方法是干嘛的?它是每读取一行数据就调用一次这个方法吗?
  • 1.2.3 有个需求,要求-条指令可以把所有文件都shuffle到同一partition 中,用MapReduce的话,你怎么写?
  • 1.2.4 *Hadoop Shuffle原理(越详细越好)?
  • 1.2.5 *combine函数的作用?
  • 1.2.6 *简列几条MapReduce的调优方法?
  • 1.2.7 *Hadoop中有哪几个进程,各自的作用是什么?
  • 1.2.8 *Yarn的job提交流程?
  • 1.2.9 现块的大小为128M,现在有一文件大小为260M,进行spilt的时候,会被分成几片?
  • 1.2.10 *列举MR中可干预的组件(详细说明各组件的原理,ps: combine) ?
  • 1.2.11 *分片与分块的区别?
  • 1.2.12 *resourceManager的工作职责?
  • 1.2.13 *NodeManager的工作职责?
  • 1.2.14 *简述Hadoop的调度器
  • 1.2.14.3 Fair Scheduler (公平调度器)
  • 1.2.15 *我们开发job时,是否可以去掉reduce阶段。
     

1.2.1 *MR的执行流程?

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.2.2 *MapReduce写过吗?有哪些关键类? mapper 的方法有哪些? setup方法是干嘛的?它是每读取一行数据就调用一次这个方法吗?

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只执行一次。 
 


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

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

 


1.2.4 *Hadoop Shuffle原理(越详细越好)?

    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.最后讲完流程,如果能再针对如何调优做--些讲解最好(调优的内容可以参考下面调优的问题)

 


1.2.5 *combine函数的作用?

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

【面试指导&技巧】
    此处需要能回答出Combine函数的作用以及目的。
 


1.2.6 *简列几条MapReduce的调优方法?

      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阶段等能讲出--些即可。

 


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

      ➢ 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.2.8 *Yarn的job提交流程?
大数据知识点梳理-Hadoop生态之MapReduce_第1张图片

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的读写流程类似,回答此类流程的问题,一般分等级。
      ➢ 最基础的, 需要能够答出大致的流程,即各个角色所起的作用,以及各个角色之间的相互关系。可以不用深入细节。
      ➢ 更进一步的, 能够回答出其中的一.些细节。
      ➢ 再进一步的,能够讲的条理清洗,能够通过画图完整讲出来,让面试官很轻松听懂。你在讲什么,非常关键。

 


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

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

【面试指导&技巧】
    注意到这个细节就可。文件切片时不是完全的按128M划分的。
 


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

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

【面试指导&技巧】
    MR中的一些步骤问题。需要掌握。该问题主要是考察,在MR的执行过程中,哪些步骤可以自定义实现。

 


1.2.11 *分片与分块的区别?

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

 


1.2.12 *resourceManager的工作职责?

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

 


1.2.13 *NodeManager的工作职责?

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

 


1.2.14 *简述Hadoop的调度器

      目前Hadoop有三种比较流行的资源调度器: FIFO、 Capacity Scheduler、Fair Scheduler。目前Hadoop2.7默认使用的是Capacity Scheduler容量调度器。

1.FIFO (先入先出调度器)
      Hadoop1.x使用的默认调度器就是FIFO。FIFO 采用队列方式将一个-一个job任务按照时间先后顺序进行服务。比如排在最前面的job需要若干maptask和若干reducetask,当发现有空闲的服务器节点就分配给这个job,直到job执行完毕。

大数据知识点梳理-Hadoop生态之MapReduce_第2张图片

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分别在各自队列中顺序比较靠前,三个任务就同时执行。
大数据知识点梳理-Hadoop生态之MapReduce_第3张图片

 

1.2.14.3 Fair Scheduler (公平调度器)

   1.持多个队列,每个队列可以配置一定的资源,每个队列中的job任务公平共享其所在队列的所有资源。
    2.队列中的job任务都是按照优先级分配资源,优先级越高分配的资源越多,但是为了确保公平每个job任务都会分配到资源。优先级是根据每个job任务的理想获取资源量减去实际获取资源量的差值决定的,差值越大优先级越高。
大数据知识点梳理-Hadoop生态之MapReduce_第4张图片

【面试指导&技巧】
    需要能够回答出Hadoop的几种调度器,每种调度器的特点,以及Hadoop2.x默认使用的调度器。
 


1.2.15 *我们开发job时,是否可以去掉reduce阶段。

    可以。设置reduce数为0即可。

【面试指导&技巧】
    考察MR中哪些阶段不是必须的。
 


未来可期,加油!

 

你可能感兴趣的:(大数据知识点梳理,Hadoop)