加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MapReduce技术习题与答案(知识点索引)

(2019-09-12 22:11:11)
标签:

it

教育

健康

旅游

财经

第七讲 MapReduce技术习题与答案

 

1.请简述mapreduce中,combiner,partition作用?

Partition:分区操作是shuffle操作中的一个重要过程,作用就是将map的结果按照规则分发到不同reduce中进行处理,从而按照分区得到多个输出结果。

Combiner:每一个MapperTask可能会产生大量的输出,combiner的作用就是在MapperTask端对输出先做一次合并,以减少传输到reducerTask的数据量。

 

2.请描述Mapreduce处理过程

答:Mapreduce处理过程:

    1)输入文件(File)

2)格式化输入文件(InputFormat)

3)分割器(InputSplit)

4)RecordReader

5)Mapper

6)分区和洗牌(Partition & Shuffle)

7)Sort

8)Reducer

9)格式化输出(OutputFormat)

 

3.简述MapReduce中Combiner的作用。

答:一)作用

(1)combiner最基本是实现本地key的聚合,对map输出的key排序,value进行迭代。如下所示:

map: (K1, V1) → list(K2, V2)

combine: (K2, list(V2)) → list(K2, V2)

reduce: (K2, list(V2)) → list(K3, V3)

(2)combiner还具有类似本地的reduce功能.

例如hadoop自带的wordcount的例子和找出value的最大值的程序,combiner和reduce完全一致。如下所示:

map: (K1, V1) → list(K2, V2)

combine: (K2, list(V2)) → list(K3, V3)

reduce: (K3, list(V3)) → list(K4, V4)

(3)如果不用combiner,那么,所有的结果都是reduce完成,效率会相对低下。使用combiner,先完成的map会在本地聚合,提升速度。

(4)对于hadoop自带的wordcount的例子,value就是一个叠加的数字,所以map一结束就可以进行reduce的value叠加,而不必要等到所有的map结束再去进行reduce的value叠加。

二)总结

combiner使用的合适,可以在满足业务的情况下提升job的速度,如果不合适,则将导致输出的结果不正确。

 

4.试分析shuffle过程的作用。

答:

Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方,Shuffle的正常意思是洗牌或弄乱,可能大家更熟悉的是Java API里的Collections.shuffle(List)方法,它会随机地打乱参数list里的元素顺序。如果你不知道MapReduce里Shuffle是什么,那么请看这张图: 

MapReduce技术习题与答案(知识点索引)

    这张是官方对Shuffle过程的描述。但我可以肯定的是,单从这张图你基本不可能明白Shuffle的过程,因为它与事实相差挺多,细节也是错乱的。后面我会具体描述Shuffle的事实情况,所以这里你只要清楚Shuffle的大致范围就成-怎样把map task的输出结果有效地传送到reduce端。也可以这样理解, Shuffle描述着数据从map task输出到reduce task输入的这段过程。 
    在Hadoop这样的集群环境中,大部分map task与reduce task的执行是在不同的节点上,当然很多情况下Reduce执行时需要跨节点去拉取其它节点上的map task结果,如果集群正在运行的job有很多,那么task的正常执行对集群内部的网络资源消耗会很严重。这种网络消耗是正常的,我们不能限制,能做的就是最大化地减少不必要的消耗。还有在节点内,相比于内存,磁盘IO对job完成时间的影响也是可观的。从最基本的要求来说,我们对Shuffle过程的期望可以有: 

  • 完整地从map task端拉取数据到reduce端。
  • 在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗。
  • 减少磁盘IO对task执行的影响。

    优化的地方主要在于减少拉取数据的量及尽量使用内存而不是磁盘,以WordCount为例,并假设它有8个map task和3个reduce task。从上图看出,Shuffle过程横跨map与reduce两端,所以下面我也会分两部分来展开。 
    先看看map端的情况,如下图: 
MapReduce技术习题与答案(知识点索引)

    整个流程我分了四步,每个map task都有一个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个map task结束后再对磁盘中这个map task产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task来拉数据。 
    当然这里的每一步都可能包含着多个步骤与细节,下面我对细节来一一说明: 
     1】、在map task执行时,它的输入数据来源于HDFS的block,当然在MapReduce概念中,map task只读取split,Split与block的对应关系可能是多对一,默认是一对一。在WordCount例子里,假设map的输入数据都是像“aaa”这样的字符串。 
     2】、在经过mapper的运行后,我们得知mapper的输出是这样一个key/value对: key是“aaa”, value是数值1。因为当前map端只做加1的操作,在reduce task里才去合并结果集。前面我们知道这个job有3个reduce task,到底当前的“aaa”应该交由哪个reduce去做呢,是需要现在决定的。 
     3】、MapReduce提供Partitioner接口,它的作用就是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模,默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制并设置到job上。 
     4】、在我们的例子中,“aaa”经过Partitioner后返回0,也就是这对值应当交由第一个reducer来处理。接下来,需要将数据写入内存缓冲区中,缓冲区的作用是批量收集map结果,减少磁盘IO的影响,我们的key/value对以及Partition的结果都会被写入缓冲区,当然写入之前,key与value值都会被序列化成字节数组。 
     5】、整个内存缓冲区就是一个字节数组,它的字节索引及key/value存储结构我没有研究过。如果有朋友对它有研究,那么请大致描述下它的细节吧。 
     这个内存缓冲区是有大小限制的,默认是100MB当map task的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写,字面意思很直观。这个溢写是由单独线程来完成,不影响往缓冲区写map结果的线程,溢写线程启动时不应该阻止map结果的输出,所以整个缓冲区有个溢写的比例spill.percent,这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程,Map task的输出结果还可以往剩下的20MB内存中写,互不影响。 
     当溢写线程启动后,需要对这80MB空间内的key做排序(Sort),排序是MapReduce模型默认的行为,这里的排序也是对序列化的字节做的排序。 
    在这里我们可以想想,因为map task的输出是需要发送到不同的reduce端去,而内存缓冲区没有对将发送到相同reduce端的数据做合并,那么这种合并应该是体现是磁盘文件中的,从官方图上也可以看到写到磁盘中的溢写文件是对不同的reduce端的数值做过合并,所以spill过程一个很重要的细节在于,如果有很多个key/value对需要发送到某个reduce端去,那么需要将这些key/value值拼接到一块,减少与partition相关的索引记录。 
    在针对每个reduce端而合并数据时,有些数据可能像这样:“aaa”/1, “aaa”/1。对于WordCount例子,就是简单地统计单词出现的次数,如果在同一个map task的结果中有很多个像“aaa”一样出现多次的key,我们就应该把它们的值合并到一块,这个过程叫reduce也叫combine。但MapReduce的术语中,reduce只指reduce端执行从多个map task取数据做计算的过程。除reduce外,非正式地合并数据只能算做combine了,其实大家知道的,MapReduce中将Combiner等同于Reducer。 
    如果client设置过Combiner,那么现在就是使用Combiner的时候了,将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量Combiner会优化MapReduce的中间结果所以它在整个模型中会多次使用。那哪些场景才能使用Combiner呢?从这里分析,Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。所以从我的想法来看,Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。Combiner的使用一定得慎重,如果用好,它对job执行效率有帮助,反之会影响reduce的最终结果。 
    每次spill会在磁盘上生成一个spill文件,如果map的输出结果真的很大,有多次这样的spill发生,磁盘上相应的就会有多个spill文件存在,当map task真正完成时,内存缓冲区中的数据也全部溢写到磁盘中形成一个溢写文件。最终磁盘中会至少有一个这样的溢写文件存在(如果map的输出结果很少,当map执行完成时,只会产生一个溢写文件),因为最终的文件只有一个,所以需要将这些溢写文件归并到一起,这个过程就叫做Merge。Merge是怎样的?如前面的例子,“aaa”从某个map task读取过来时值是5,从另外一个map 读取时值是8,因为它们有相同的key,所以得merge成group。什么是group。对于“aaa”就是像这样的:{“aaa”, [5, 8, 2, …]},数组中的值就是从不同溢写文件中读取出来的,然后再把这些值加起来。请注意,因为merge是将多个溢写文件合并到一个文件,所以可能也有相同的key存在,在这个过程中如果client设置过Combiner,也会使用Combiner来合并相同的key。 
    至此,map端的所有工作都已结束,最终生成的这个文件也存放在TaskTracker够得着的某个本地目录内,每个reduce task不断地通过RPC从JobTracker那里获取map task是否完成的信息,如果reduce task得到通知,获知某台TaskTracker上的map task执行完成,Shuffle的后半段过程开始启动。 
    简单地说,reduce task在执行之前的工作就是不断地拉取当前job里每个map task的最终结果,然后对从不同地方拉取过来的数据不断地做merge,也最终形成一个文件作为reduce task的输入文件。见下图: 
MapReduce技术习题与答案(知识点索引)

     如map端的细节图,Shuffle在reduce端的过程也能用图上标明的三点来概括。当前reduce copy数据的前提是它要从JobTracker获得有哪些map task已执行结束,Reducer真正运行之前,所有的时间都是在拉取数据,做merge,且不断重复地在做。如前面的方式一样,下面我也分段地描述reduce 端的Shuffle细节: 
     1>、Copy过程,简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求map task所在的TaskTracker获取map task的输出文件,因为map task早已结束,这些文件就归TaskTracker管理在本地磁盘中。 
     2>、Merge阶段,这里的merge如map端的merge动作,只是数组中存放的是不同map端copy来的数值。Copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端的更为灵活,它基于JVM的heap size设置,因为Shuffle阶段Reducer不运行,所以应该把绝大部分的内存都给Shuffle用,这里需要强调的是,merge有三种形式:1)内存到内存  2)内存到磁盘  3)磁盘到磁盘。默认情况下第一种形式不启用,让人比较困惑,是吧。当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map 端类似,这也是spill的过程,这个过程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多的spill文件,第二种merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的那个文件。 
     3>、Reducer的输入文件,不断地merge后,最后会生成一个“最终文件”。为什么加引号?因为这个文件可能存在于磁盘上,也可能存在于内存中。对我们来说,当然希望它存放于内存中,直接作为Reducer的输入,但默认情况下,这个文件是存放于磁盘中的,当Reducer的输入文件已定,整个Shuffle才最终结束,然后就是Reducer执行,把结果放到HDFS上。

 

5.试描述JobTracker和TaskTracker的功能。

答:

<一>总体结构

(1)Hadoop MapReduce采用Master/Slave结构。

*Master:是整个集群的唯一的全局管理者,功能包括:作业管理、状态监控和任务调度等,即MapReduce中的JobTracker。

*Slave:负责任务的执行和任务状态的回报,即MapReduce中的TaskTracker。

<二> JobTracker功能:

(1)概述:JobTracker是一个后台服务进程,启动之后,会一直监听并接收来自各个TaskTracker发送的心跳信息,包括资源使用情况和任务运行情况等信息。

(2)JobTracker的主要功能:

1>.作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业的分解和状态监控。

*最重要的是状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。主要作用:容错和为任务调度提供决策依据。

2>.资源管理。

<三> TaskTracker功能:

(1)TaskTracker概述:TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务等;另一方面,

 将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。TaskTracker与JobTracker和Task之间采用了RPC协议进行通信。

(2)TaskTracker的功能:

1>.汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分:

*机器级别信息:节点健康情况、资源使用情况等。

*任务级别信息:任务执行进度、任务运行状态等。

2>.执行命令:JobTracker会给TaskTracker下达各种命令,主要包括:启动任务(LaunchTaskAction)、提交任务(CommitTaskAction)、杀死任务(KillTaskAction)、

 杀死作业(KillJobAction)和重新初始化(TaskTrackerReinitAction)。

 

6.下面关于MapReduce模型中Map函数与Reduce函数的描述正确的是(   

A.一个Map函数就是对一部分原始数据进行指定的操作。

B.一个Map操作就是对每个ReD.uce所产生的一部分中间结果进行合并操作。

C.Map与Map之间不是相互独立的。

D.Reducee与Reduce之间不是相互独立的。

 

7.下列关于HDFS为存储MapReduce并行切分和处理的数据做的设计,错误的是

  A.FSDataInputStream扩展了DataInputStream以支持随机读

  B.为实现细粒度并行,输入分片(Input Split)应该越小越好

  C.一台机器可能被指派从输入文件的任意位置开始处理一个分片

  D.输入分片是一种记录的逻辑划分,而HDFS数据块是对输入数据的物理分割

  答案:B

 

8、 在将数据源经过分析挖掘到最终获得价值的大数据处理过程中,MapReduce是在(  )阶段应用分布式并行处理关键技术的常用工具。B

A、数据采集

B、数据管理

C、数据存储

D、数据分析与挖掘

 

9、并行数据处理引擎MapReduce适用于处理哪类任务?()。B

A、在线访问类任务

B、离线分析类任务

C、高性能计算类任务

D、实时计算类任务

 

10.下面关于MapReduce的combiner优化叙述正确的是(   )A

 A.可以降低网络传输的数据量

B.实现了本地局部的数据聚合

C.属于reduce阶段的操作

D.解决了数据倾斜的问题

 

11.关于MapReduce的描述错误的是() D

A、MapReduce框架会先排序map任务的输出

B、通常,作业的输入输出都会被存储在文件系统中

C、通常计算节点和存储节点是同一节点

D、一个Task通常会把输入集切分成若干独立的数据块

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有