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