map,shuffer,reduce阶段任务

map,shuffer,reduce阶段任务

 1.inputsplit:这是map端口接受数据的来源

每一个Split切片分配一个MapTask,默认情况下切片大小=blocksize(128M),每一个文件都是单独进行切片的

通过RecordReader类,把每个InputSplit解析成一个个<k1,v1>。默认,框架对每个InputSplit中的每一行,解析成一个<k1,v1>。

这里的k1是每一行开头数据的偏移量,value就是每一行的数据

2.来到map阶段

map阶段将Split的内容读取后输出新的<k2,v2> v2的内容应该是<key1,1><key2,1>......

3.buffer in memory 缓存

每个map阶段的输出k-v对会存放到内存缓冲区,这是一个环形的内存缓冲区,用于存储map的输出,这是一个名叫KVbuffer的数组,默认大小100MB。一旦达到阀值0.8即80m,一个后台线程把内容溢写到(spilt)磁盘的指定目录(mapred.local.dir)下的一个新建文件中。

存储到磁盘又可以称为是数据落地

4.map的shuffer阶段 :分区,排序,合并溢出文件

partition分区:对于map输出的每一个键值对,系统都会给一个默认的partition,它的值是是通过计算key的哈希值再和ReduceTask的数量取模得到的,如果只有一个ReduceTask,那partition相当于是无效的.

sort排序:将同一partition的内容会根据key升序排序(字典顺序)

merge :如果map阶段输出的数据量很大,将上面的溢写文件合并成一个 溢写文件存储在磁盘中,等待ReduceTask过来拉取

combine:这个操作在sort之后,可以将来自不同溢写文件的key合并,类似reduceTask中将<key1,{1,1,1,1,1}> 合并成<key1,5>方便reduce的操作,

但是也有注意的地方,使用combine后你必须要保证最终reduce输出的结果必须和原来一样,因为上面只是将了将key后面valueList的值相加,这当然不会有问题,如果是乘法除法求平均数等,combine的操作肯定是会影响最终结果的

5.reduce阶段的shuffer阶段:
reduce阶段的shuffle主要分为复制Map输出、排序合并两个阶段

copy:r map阶段的任务完成后,会通知TaskTracker状态更新,TaskTracker通知 JobTracker

reduce会定期向JobTracker获取Map的输出位置,然后将map输出的数据复制到本地

merge:这里与map阶段的merge类似,将多个map端copy来的数据先放进内存缓冲区,内存的数据到达阈值会写入磁盘中,最后合成总的溢写文件

6.接受输入文件后,

reduce执行分区排序合并,将输出结果保存到hdfs

上一篇:49. Group Anagrams(js)


下一篇:Python中类-带括号与不带括号的区别