1.maptask程序的运行个数: 是由 split个数决定
split:逻辑切片规则--->block_size=128M ,每128为一个块,不足128为一个block,
split个数是由==>文件个数 文件大小 分布式存储时的块的大小决定
2.input:输入数据,按行读取数据,返回kv键值对,k是偏移量,v是这样一行的内容
[用户代码]3.map task:一般是业务逻辑代码,把数据处理成为<k,v>
[一行数据处理一次]
shuffle输入==><hello,1>
==================================shuffle start======================================
[map shuffle 开始]
4.patition:分区就是给数据打上标签<k,v,n>,根据reducetask个数决定,如果reducetask个数<=1 ,则不分区
分区的个数可以解决数据倾斜问题,增加reduce个数
分区的目的:分组,Join,聚合
可以使用自定义分区规则:
grouby sex:底层就是修改分区规则
保存map task结果:
5.spill:溢写,
使用内存缓冲区:原因:避免数据频繁读写[底层是按行读写],所以使用100M,当80M时写入磁盘
6.sort:溢写的时候根据key进行排序,默认根据key字典序排序,k相同的放在一起
[排序1]
[<k,v1,n>,<k,v2,n>,<k,v3,n>,<k,v4,n>]
7.Combiner:提前reduce===><k,V_r,n>
8.merge:溢写会产生多个有序的小文件, 把有序的小文件进行合并成一个文件
[合并之后需要进行归并排序,再次把相同的k放到一起 ]
[ 排序2]
[map shuffle 结束]
[reduce shuffle 开始]
reduce task:默认个数用远1个==>设置:
1.fecher: 拉取==>启动单独的线程到maptask拉取数据
从每个maptask的输出中,拉取对应的分区,也是采用 溢写的方式
拉过来的数据:
来自不同的文件
[分区值相同]:这里就是产生数据倾斜的原因
key值不一定相同
解决:
2.spill:溢写,同样是,采用溢写的方式
merge合并:溢写会产生多个有序的小文件, 把有序的小文件进行合并成一个文件
sort排序:[因为key值不一定相同,时乱序的, 所以要再排序]
[ 排序3]
[拉取之后,完成的相同的key放到一起的操作]
3.grouping: 分组==>把key相同的分为一组,每组去调用一次代码,=进行业务处理=,内部构成新的键值对
<k1,[v1,v2,v3,v4...]>
<k2,[v1,v2,v3,v4...]>
...
[reduce shuffle 结束]
===================================shuffle end======================================
shuffle输出==><hello,[1,1,1,1...]>
4.[用户代码]reduce task:交给拥堵进行reduce阶段业务逻辑处理
[一组数据处理一次]
5.output:将处理的结果输出到指定的目录下,要求这个目录不能提前存在
input–>map–>patition–>spill–>小文件内的sort[–>combiner]–>merge–大文件内的sort[–>combiner]>–>fetch–>spill–>merge–>大文件内的sort–>grouping–>reduce–>output