MapReduce分为两部分:map阶段和reduce阶段
MapReduce优点:并行计算
MapReduce的整个工作过程
split:作用是解耦(并非物理切割)默认情况下切片(可自定义大小,逻辑切割)等于块儿,非默认情况下切片可小于或大于块儿,为了满足不同的计算场景,控制并行度,可定义多个切片,map的并行度是由切片决定的(块儿是物理切割的,当块儿和切片相等的话,块儿的偏移量,切片可以用块儿的偏移量及副本信息,切片可以决定map的计算程序最终移动到哪一台计算机,很好的实现计算项数据移动语义,当一个块儿有多个切片时候,数据的拼接是由框架去解决的)
input:输入原始数据
mapreduce框架:自动将每一行数据用行号来编成key(输入给map之前)
map:输入给map是k–v,经过map的处理,将每一行单独转换成另外的k—v段(以一条记录为单位做映射),映射,变换,过滤,1进N出,有recode,format,如果以一个换行符切割的话,则拿到一行数据调用一次map,如果以复杂符格式化,比如以开闭标签(<>为一个的单位),那么就会拿到若干行传一次map
(注:map输出的数据有很多重复的,并且没有被排序,不利于下一步的reduce处理,为了下一步的reduce处理,故对map输出的数据进行洗牌)
shuffle:洗牌,分组加排序的过程,把同样的数据拿出来放到一组,和同一个k映射,洗牌之后的数据变得更加规整,发送给rudeuce
reduce:进行化简,从数据集当中取出最大值,生成新的输出(以一组为单位做计算),分解,缩小,归纳,一组进N出,也有并行度的概念,如果并行度足够大,则数据处理速度将会足够快,其并行度由开发人员来决定
并行数量比
注意:
1.在mapreduce当中,组是一个最小粒度,不可被拆分
2.如果是reduce由1变N的话,则注意组必须要保护,组不可以被打散到不同的分区里,要不然计算就会不准
3.更多使用的是在缓冲区的IO(Buffer)
4.在分区的时候做一次小排序,得到这个文件写到磁盘,这个文件的特征是外无序但内有序,然后去做归并排序算法,得到一个分区有序的文件
5.map并没有对key排序,只对context做了排序(格式为k-v-context),在shuffer阶段进行排序,归并的0号分区内的文件是无序的
6.如果有多组,那么reduce的处理是从一组的开头处理到结尾,再开始下一组,那么其处理时间复杂度是(O)n(n是组的数量)
7.内存缓冲区在溢写磁盘时,做一个2次排序,分区有序,且分区内key有序
经验:数据集一般是用迭代计算的方式
看了大神文档,觉得非常详细,理解更加深刻
https://blog.youkuaiyun.com/heartless_killer/article/details/102671283