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网络就不使用,在必须使用的前提下,能少用就少用