大数据开发面试题【MapReduce篇】

25、MR工作原理

Input Spliting:输入的数据被拆分成更小数据块(Input Splits:将大文件切割成适合并行处理的小块数据,每个小块数据称为一个分片,一个分片作为MR处理的基本单元)
Mapping:mapper节点将分配到数据块执行map操作,产生中间结果(k,v)键值对并写入到本地磁盘
Shuffling and Sorting:Mapper节点会根据Key进行排序,并将相同Key的Value聚合起来。
Reducing:Reducer节点接收到所有属于自己哈希范围内键值对后开始执行reduce操作,生成最终结果。

补充:

1、获取待处理文件大小;
2、根据block大小,划分数据块,形成一个任务分配的规划
3、提交信息
4、计算mapTask数量,MrAppMaster根据切片大小划分maptask的数量
5、根据inputformat读取数据获取偏移量
6、读完数据以后将数据给到mapper,根据用户自己的写定的需求执行
7、将map端的输出结果写入环形缓冲区中(默认大小100MB,一半记录数据,一半记录索引)达到80%以后进行反向溢写,溢写的时候对分区内的数据进行快排(对索引的指针的方式进行排序,不改变存储位置)
8、溢写到磁盘上,使用归并排序,保证每一个分区内部的数据是有序的,数据此时放在磁盘上
9、combiner合并,
10、所有的maptask任务完成后,启动相应数量的reducetask,并告知reducetask处理数据范围(reducetask主动拉取数据)
11、拉取对应分区的数据,合并文件,归并排序;
12、根据reducer的逻辑执行,再写出textoutputformat

26、MapReduce为什么一定要有环型缓冲区?

为了解决数据传输和处理的效率而设计的,作用是在Map和Reduce中间传输数据,使得数据可以在不同的节点之间进行流转和处理
Map和Reduce之间是通过磁盘进行数据传输的,会引入大量的磁盘IO操作,降低了处理速度,环形缓冲区可以将这些传输操作放在内存中及进行,减少磁盘的IO
环形缓冲区可以同时接收多个Map的输出,并在Reduce开始之间进行整理和排序,提高处理效率
环形缓冲区可以避免在map和reduce之间进行数据的重复读取和写入,节省网络带宽
注意:环形缓冲区不需要重复申请新的内存,而是重复利用,规避了垃圾回收机制,也规避了频繁申请内存引发的问题
环形缓冲区有三部分:空闲区、数据区、索引区,初始位置叫做equator
数据是从equator的左边开始写入,索引是从equator的右边开始写入;
当数据和索引的大小达到和环形缓冲区的80%以后:1、对写入的数据进行原地快速排序,并把排好的数据和索引spill到磁盘上去;2、在空闲的20%区域里计算一个新的equator,然后冲洗那些如数据和索引;3、当20%写完并且上次的80%的数据还没写入到磁盘的时候,程序会panding,等80%空间腾出来再写

补充:反向溢写

当数据和索引的大小达到了80%以后,会有两个动作
1、对写入的数据进行原地排序,并把排序号的数据和索引spill到磁盘上去
2、在空闲的20%区域中,重新计算一个新的赤道,然后再新赤道的右边写数据,左边写索引
3、当20%写满以后,但是上一次的80%的数据还有写入到磁盘的时候,程序就会暂停,等80%空间腾出来以后再继续写

27、MapReduce为什么一定要有Shuffle过程?

负责对map阶段的出处结果进行排序和重新分区,以便使得相同的key聚在一起;
数据排序:对map阶段输出的结果进行排序,确保reduce能够按照key的顺序进行处理
数据聚合:将相同的key的值聚合在一起,使得reduce任务能够对这些值进行合并计算,提高效率

补充:

环形缓冲区不需要重新申请内存,始终用的同一块内存空间,不断重复利用,完美地规避了java中的来及回收机制i导致的问题

28、Shuffle的优化

Map阶段: 增大环形缓冲区大小、增大环形缓冲区的溢写比例、减少对溢写文件的合并次数
Reduce阶段:规避使用Reudce

29、Reduce怎么知道去哪里拉Map结果集?

reduce拉取的数据是由事先规定的分区规则来的,将所有具有相同的键值对发送到同一个reduce任务进行处理。每个reduce会找到属于自己分区中的键值对;Reduce任务知道去哪里拉Map结果集是通过分区规则和数据的键确定的。

30、MapReduce Shuffle的排序算法?

排序算法在shuffle过程中的作用是对map任务的输出键值对进行排序,以便reduce任务可以按照特定的顺序接收和处理数据,map将输出键值对按照键进行排序,然后将排序后的数据划分为多个分区,并将每个分区的数据传输给对应的reduce任务(快排)

31、MapReduce shuffle为什么要排序?

是因为为了保证reducer能够按照键的顺序进行合并和处理,map阶段mapper将输出的键值对按照键进行分区,发送给对应的reducer。在reducer端为了合并相同键的所有值,进行排序后,以便将相同的键的值聚合在一起。排序可以减少reducer端的内存占用和磁盘IO

32、MapReduce mapjoin的原理(实现)?

原理:将小表加载到内存中,然后在map阶段将其广播到所有的mapper节点上,以便于在map阶段进行关联

33、MapReduce reducejoin原理

MR的reducejoin通过map阶段将具有相同键的数据进行标记,然后通过shuflle阶段将具有相同键的数据发送到同一个reduce任务中,最后在reduce阶段将具有相同键的数据进行连接操作;(一般用于处理大表与大表之间的连接)

34、MR为什么不能产生过多的小文件

文件系统开销:每个小文件都需要在文件系统中分配磁盘空间和记录元数据信息
任务调度开销:在MR中,任务调度器会为每一个文件启动一个map任务,而任务的启动管理带来开销
数据传输开销:在节点间的传输,每个小文件都需要进行独立的传输,
处理效率:每个文件都需要启动一个任务进行处理,导致启动任务的实际时间大于任务的处理时间

35、MR分区

对Map的key进行分区,将不同分区的key交由不同的reduce处理,partition属于map阶段的任务
默认分区是根据key的hashcode对reduceTasks个数取模得到的
在默认情况下,partition分区的数量等于reducetask的数量,所以此时也可能导致数据倾斜

补充:

partition分区是shuffle的一部分功能,它的作用是按照条件把结果输出到不同的文件中

36、ReduceTask数量和分区数量关系?

map阶段将输入数据分割为多个分区,并为每个分区分配一个maptask来处理。而reduce阶段将输出的结果按照键进行排序,具有相同键的记录发送给同一个reducetask处理。故reducetask的数量大于等于分区数量

补充:

reducer个数是由partition个数决定的,mapper产生中间数据经过shuffle过程,根据业务逻辑把数据划分为若干个partition,每个partition的数据由对应的一个reducer来处理

37、MR中的map分片

map阶段的分片和block块很像,block是HDFS当中存储数据的单位,切片是splitMR当中每个MapTask处理数据量的单位
block数据分块是物理上的概念,而map中分片是逻辑上的概念
block:物理上的划分,是HDFS中的存储单位,1.0版本默认64MB,2.3版本默认128MB,属于是上传文件划分的数据块的大小
split分片:属于逻辑上的划分,只是为了让MapTask更好地获取数据,

38、MapReduce map输出的数据超出它的文件内存之后,是落地到磁盘还是落地到HDFS中?

map端输出的数据会先缓存到内存中,达到一定的阈值时候,会通过partition将数据分区后写入磁盘,会被存储到hdfs上,后续reducer从hdfs上读取数据进行处理

39、MapReduce怎么确定MapTask的数量?

会根据输入文件计算输入数据分片(input split),每个数据分片针对一个map任务,数据分片存储的并非数据本身,而是一个分片长度和一个记录数据的位置的数组
影响map个数的因素:文件的大小,文件的个数、以及splitSize的大小,分片是按照splitsize的大小进行分割的,一个split的大小在没有设置的情况下,默认等与block的大小

40、MapReduce的map进程和reducer进程的jvm垃圾回收器怎么选择可以提高吞吐量?

41、MapReduce的map进程和reducer进程的jvm垃圾回收器怎么选择可以提高吞吐量?

中间的数据会落盘到本地磁盘上,而不是存储在内存中,通常处理的是大规模数据集;中间数据存储在本地磁盘上可以确保数据的持久性和可靠性

42、数据倾斜产生的原因以及解决方案

原因:
按照key进行聚合或者join操作,某个key值对应的数据量特别大,就会发生数据倾斜
解决方案:
1、提前在map进行combine,减少数据的数据量;把一个mapper中相同的key进行聚合,减少了shuffle过程中传输的数据量,以及reduce端的计算量
2、将数据倾斜的部分记录拆分成多个小文件,然后将这些小文件发送到多个reduce上进行处理,分散数据倾斜的压力
3、增加reducer,提高并行度
4、实现自定义分区,根据数据分布情况,自定义散列函数,将key均匀的分布到不同的reducer

43、MapReduce运行过程中会发生OOM,OOM发生的位置?

Map阶段:当mapper任务处理输入数据时候,输入数据量过大或者mapper函数在处理数据时候产生大量的中间键值对,造成内存溢出
Reduce阶段:当reducer任务处理来自mapper的中间键值对时候,中间键值对数量过大或者reducer函数在处理数据时候产生大量的输出数据,造成内存溢出
Shuffle阶段:大量的中间数据需要在map和reduce中间传输,中间数据量过大,造成内存溢出
Combiner阶段:当combiner处理大量的中间键值对时候,也可能造成内存溢出

44、MapReduce用了几次排序,分别是什么?

三次排序;
1)当map输出时候,首先写入环形缓冲区,达到阈值以后,在刷写磁盘之前,后台线程会将缓冲区的数据划分成相应的分区,在每个分区中,后台线程按键进行内排序
2)map任务完成之前,磁盘上存在多个已经分好区、排好序的,大小和缓冲区一样的溢写文件,溢写文件将被合并成一个已分区已排号序的输出文件,合并文件只需要再做一次排序可以使输出文件整体有序
3)再recuce阶段,将多个map任务的输出文件copy到reduce tesk中后合并,由于经过二次排序,所以合并文件时候只需要再做一次排序就可以使输出文件整体有序

  • 33
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值