mapreduce基础

mapreduce核心思想:分而治之,先分后合 分是map,合是reduce

Shuffle包含哪些步骤

宏观层面:

1.分区

2.排序

3.combine(局部聚和)

4.分组

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

第一步:inputFormat   在hdfs文件系统中读取要进行计算的数据输出给spilt

第二步:spilt  将数据进行逻辑切分,切分成多个任务,输出给RR(recordreader)

第三步:RR RR将切分后的数据转换成key value进行输出  key:每一行行首字母的偏移量   value :每一行数据

第四步:输出给Map  接收一条一条的数据(有多少行数据 ,map运行多少次),根据业务需求编写代码 .Map的输出是key value 的list 输出给shuffle(partition)

------------------------------map----------------------------

第五步:partition 按照一定的规则对 key value 的list进行分区 输出给shuffle(sort)

第六步:sort 对每个分区内的数据进行排序 输出给shuffle(combiner)

第七步:combiner 在Map端进行局部聚合(汇总),目的是减少网络带宽的开销,输出给shuffle(group)

第八步:group 将相同key的key提取出来作为唯一的key 组装成一个value的list 输出给shuffle(reduce)

----------------------------shuffle--------------------------

第九步:reduce 根据业务需求对传入的数据进行汇总计算,输出给shuffle(outputFormat)

第十步:outputFormat 将最终的结果写入hdfs

---------------------------reduce--------------------------------

如何设置reduceTask的数量? 在驱动类中设置setNumReduceTasks

combine的作用? 局部聚合,以此减少io与网络开销 ,运行在map端

Maptask的数量可以人为设置吗?  不可以,由输入的数据决定

Shuffle阶段的partition分区算法是什么? hashpartition,对map端输出的key取哈希值,用这个哈希值与mapreduce的个数取余

spilt切分数据的大小是多少? 默认128m

内存角度接收mapreduce的输出到reduce的输入过程

1 map不断向内存中的环形缓存区域输人数据,在此过程中会使用hashpartition算出分区

2 当环形缓存区中的数据达到默认的0.8阈值时,锁定这 0.8的数据,进行一次排序,开启溢写,将数据flush到磁盘生成临时文件,当临时文件达到4个时进行merge合并,在此过程中,剩下的0.2剩余空间继续接受map输出的数据,此过程同时进行,互补影响

3 当输出完成后会对本地的临时文件进行merge合并,然后等待reduce拉取

4 reduce task通过http从map task拉取属于自己分区的数据到内存中

5 归并排序所有文件,发送给reduce

最优的map效率是什么?

尽量减少环形缓冲区flush的次数(减少磁盘io的使用次数)

1 加大环形缓冲区的内存

2 增大缓冲区阈值的大小

3 对输出的数据进行压缩(压缩-解压的过程会消耗cpu)

最优的reduce是是什么?

尽量将所有数据在内存中计算

集群优化的核心思路是什么?

所有的,只要能减少网络带宽的开销,只能能够减少磁盘io的使用的次数的配置项,都是集群调优的可选项,

在网络带宽,磁盘io是瓶颈的前提下,能不使用io网络就不使用,在必须使用的前提下,能少用就少用

原文地址:https://www.cnblogs.com/fengyouheng/p/15416754.html