map负责切分,reduce负责合并(先分后合,分而治之)
每行的行首到首行行首的距离
分区(partition)----------->排序(sort)------------>combine----------->分组(group)
第一步:inputformat数据读取
输出给Split
第二步:split进行数据逻辑切分
输出给RR
第三步:recordReader(将数据以\n切分,进行再次切分,并输出key(行首偏移量),value(一行的数据))
输出给Map
第四步:Map接受key(行首偏移量),value(一行的数据),根域业务需求编写代码,输出(key,value 的list)
输出给Shuffle(partition)
shuffle(核心机制:数据分区,排序,分组,ComBine,合并等过程) 输出key value的list
**第五步: 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)
第九步: reduce: 根据业务需求对传入的数据进行汇总计算。 输出给Shuffle(outputFormat)
第十步:outputFormat outputFormat:将最终的额结果写入HDFS
reducetask的设置: job.setNumReduceTasks(个数);
Map结束后,在Map端进行局部聚和。作用:较少网络传出次数,降低了网络带宽开销。
Map端。在Map端中shuffle中。
不可以
计算逻辑:对map输出的key 取哈希值,用这个哈希值与reducetask的个数值取余。余几,就将这个key,value放在
对应的分区编号里(分区有多个编号)。
128M
Map将数据传入环形缓冲区(默认100MB 可修改),环形缓冲区中的数据到达一定的阈值时(默认0.8 可修改)进行溢写生成好多临时文件,多个临时文件到达一定数量进行merge合并成一个大文件,
reduce会主动去发起拷贝线程到maptask获取属于自己的数据,数据会进入ReduceTask中的环形缓冲区,当缓冲区中的数据量到达一定阈值进行溢写,多个临时文件merge合并成一个大文件,最后输入到Reduce。
Map端的最高效率是:尽量减少环形缓冲区flush的次数(减少磁盘IO 的使用次数)
增加环形缓冲区内存
将阈值上调
压缩map输出的数据大小(消耗cpu)
Reduce端的最高效率是:尽量减少环形缓冲区flush的次数
尽量将数据放在内存上进行计算
1、加大环形缓冲区的内存
2、增大缓冲区阈值的大小 (考虑剩余的空间是不是够系统使用)
3、对输出的进行压缩(压缩-解压的过程会消耗CPU)
在网络带宽、磁盘IO是瓶颈的前提下
能不使用IO 网络就不使用,在必须使用的前提下,能少用就少用。
所有的,只要能够减少网络带宽的开销,只要能够减少磁盘io的使用的次数的配置项,都是集群调优的可选项。
(可选项包括: 软件层面【系统软件和集群软件】,硬件层面,网络层面)