Hadoop生态——MapReduce

MapReduce

1*MR的执行流程?

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)Reduce ask会取到同一个分区的来自不同maptask的结果文件,reducetask会将这些文件再进行归并排序。
  • 7)合并成大文件后,shuffle的过程也就结束的,后面进入reducemask的逻辑运算过程(从文件中取出一个一个的键值对group,调用用户自定义的reduce()方法)。
  1. MRAPPmaster监控到所有的maptask进程任务完成后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据分区。
  2. reducetask进程启动后,根据MRAPPmaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取若干个maptask输出结果文件,并在本地进行重新归并排序,然后按照相同key的KV为一个组,调用客户定义的reduce()方法进行逻辑运算。
  3. 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原理(越详细越好)?

  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逻辑,将结果输出到文件。
技巧
  1. 该问题非常重要,需要重点掌握(一般为必问问题)。
  2. 首先需要回答出map()方法之后,reduce()方法之前为shuffle阶段。
  3. 然后按照相应的顺序,分为map端和reduce端:map()->分区->环形缓冲区->排序->溢写->归并排序->写入磁盘,等待reduce端拉取。reduce端:reduce端拉取对应分区数据->存储在内存(内存不足,写入磁盘)—>拉取完数据,归并排序->对数据进行分组->每组数据调用一次reduce()方法。按照这种顺序去讲解整体的过程。
  4. 在讲的过程中,需要注意一些关键点,相关流程,细节,比如数据什么时候写磁盘,什么时候在内存,什么时候进行什么排序,什么时候进行溢写等。
  5. 最后讲完流程,如果能再针对如何调优做一些讲解最好(调优的内容可以参考下面调优的问题)

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.数据输入
  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二进制文件。
技巧

此处需要能回答出几个主要方面的调优手段。不一定能够全部讲出来,针对每一个阶段,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.作业提交
  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.作业初始化
  1. 当ResourceManager收到Client的请求后,将该job添加到容量调度器(Resource Scheduler)中。
  2. 某一个空闲的NodeManager领取到该job。
  3. 该NodeManager创建Container,并产生MrAppMaster。
  4. 下载Client提交的资源到本地,根据分片信息生成MapTask和ReduceTask。
3.任务分配
  1. MrAppMaster向ResourceManager申请运行多个MapTask任务资源。
  2. ResourceManager将运行MapTask任务分配给空闲的多个NodeManager,NodeManager分别领取任务并创建容器(Container)。
4.任务运行
  1. MrAppMaster向两个接收任务的NodeManager发送程序启动脚本,每个接收到任务的NodeManager启动MapTask,MapTask对数据进行数据处理,并分区排序。
  2. MrAppMaster等待所有MapTask运行完毕后,向ResourceManager申请容器(Container),运行ReduceTask。
  3. 程序进行完毕后,MrAppMaster会向ResourceManager申请注销自己。
  4. 进度和状态更新。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。

  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任务的理想获取资源量减去实际获取资源类的差值决定的,差值越大优先级越高。
    在这里插入图片描述
技巧

需要能够回答出Hadoop的几种调度器。每种调度器的特点,以及Hadoop2.x默认使用的调度器。

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

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

技巧

考察MR中哪些阶段不是必须的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值