大数据开发面试题【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中后合并,由于经过二次排序,所以合并文件时候只需要再做一次排序就可以使输出文件整体有序
#23届找工作求助阵地##软件开发薪资爆料#不定期分享大数据相关技术面经,本着免费原则,随意白嫖