MapReduce面试题

MapReduce核心思想
分而治之,先分后合
分是Map 和是reduce
偏移量
指的是每行行首字母移动到文本的最前面需要的距离
Suffle包含哪些步骤
宏观层面:
1.分区
2.排序
3.Combiner(局部聚合)
4.分组

MR从读取数据开始到将最终结果写入HDFS经过哪些步骤

	第一步:InputFormat
	InputFormat 在HDFS文件系统中读取要进行计算的数据
	输出给Split
	第二步:Split
	Split 将数据进行逻辑切分,切分成多个任务。
	输出给RR(RecordReader)
	第三步:RR(RecordReader)
	RR 将切分后的数据转换成key value进行输出
	key : 每一行行首字母的偏移量
	value: 每一行数据
	输出给Map
	第四步:Map
	接收一条一条的数据(有多少行数据Map运行多少次,输出的次数根据实际业务需求而定)
	根域业务需求编写代码
	Map的输出是 key value的 list
	输出给Shuffle(partition)
---------------------------------------Map-------------------------------------------------------
	第五步: partition
	partition: 按照一定的规则对 **key value的 list进行分区
	输出给Shuffle(sort)
	第六步:Sort
	Sort :对每个分区内的数据进行排序。
	输出给Shuffle(Combiner)
	第七步:Combiner
	Combiner: 在Map端进行局部聚合(汇总)
	目的是为了减少网络带宽的开销
	输出给Shuffle(Group)
	第八步:Group
	Group: 将相同key的key提取出来作为唯一的key
	将相同key对应的value提取出来组装成一个value 的List
	输出给Shuffle(reduce)
------------------------------------Shuffle--------------------------------------------
	第九步:reduce
	reduce: 根据业务需求对传入的数据进行汇总计算。
	输出给Shuffle(outputFormat)
	第十步:outputFormat
	outputFormat:将最终的额结果写入HDFS
------------------------------------reduce--------------------------------------------

如何设置ReduceTask的数量
在驱动类中添加 setNumReduceTasks

combiner的作用
局部聚合,以此减少io与网络开销

combiner运行在MapReduce的哪一端?
Map端

Maptask的数量是可以人为设置的吗?
不可以,MapTask数量决定数据

Shuffle阶段的Partition分区算法是什么
hashPartition,对Map输出的key进行hash,然后和reduce task进行取模运算

计算逻辑:对map输出的key 取哈希值,用这个哈希值与reducetask的个数值取余。余几,就将这个key,value放在
对应的分区编号里(分区有多个编号)。

Split逻辑切分数据,节分大小是多大?
128M

内存角度介绍Map的输出到Reduce的输入的过程。
1.map不断向内存中的环形缓存区输出数据,在此过程中会使用hashpartition算出分区;
2.当环形缓存区中的数据达到默认的0.8阈值时,锁定这0.8的数据,进行一次排序,开启溢写,将数据flush到磁盘生成临时文件,当临时文件达到4个时进行merge合并
,在此过程中,剩下的0.2剩余空间继续接收map输出的数据,此过程同时进行,互不影响
3.当map输出完成后会对本地的临时文件进行merge合并,然后等待reduce拉取
4.reduce task通过http从map task拉取属于自己分区的数据到内存中,到达0.8阈值时,锁定这0.8的数据,进行一次排序,开启溢写,
将数据flush到磁盘生成临时文件,当临时文件达到4个时进行merge合并
5.归并排序所有文件,发送给reduce


最优的Map效率是什么?
尽量减少环形缓冲区flush的次数(减少磁盘IO的使用次数)
如何能够减少环形缓冲区flush的次数:
1、加大环形缓冲区的内存
2、增大缓冲区阈值的大小 (考虑剩余的空间是不是够系统使用)
3、对输出的进行压缩(压缩-解压的过程会消耗CPU)

最优的reduce是什么?
尽量减少环形缓冲区flush的次数
1、尽量将所有的数据在内存中计算

在MR阶段,有哪些优化的点?(至少两个点)
软件层面【系统软件和集群软件】,硬件层面,网络层面
1、加大环形缓冲区的内存
2、增大缓冲区阈值的大小 (考虑剩余的空间是不是够系统使用)
3、对输出的进行压缩(压缩-解压的过程会消耗CPU)

集群优化的核心思路是什么?
所有的,只要能够减少网络带宽的开销,只要能够减少磁盘io的使用的次数的配置项,
都是集群调优的可选项。

在网络带宽、磁盘IO是瓶颈的前提下
能不使用IO 网络就不使用,在必须使用的前提下,能少用就少用。
所有的,只要能够减少网络带宽的开销,只要能够减少磁盘io的使用的次数的配置项,都是集群调优的可选项。
(可选项包括: 软件层面【系统软件和集群软件】,硬件层面,网络层面)

你可能感兴趣的:(MapReduce,MapReduce面试题)