LineRecordReader,Mapper,Context
mapTask---->run-------->setup--------->while(context.nextKeyValue---->LineRecordReader得到map方法需要的的key和value)-------->map---------> context.write(k,v)-------> 分区,hashPartitioner{ getPartition }-------->往环形缓冲区写元数据(分区值。。。)和kv的序列化结果,当缓冲区(最大100M)中的内容大于80%----->spiller首先要把缓冲区中的数据 先按照分区号排序, 再按照K排序(QucikSort,可以重写)------>溢出yarnChild的磁盘目录首先按照分区序号来写,写在同一个文件里,而且附带一个索引文件来表明 0号区的内容偏移量----->不断写,不断溢出 最后形成一堆小溢出文件-------->Merger,归并排序,将多个文件的相同分区放在一起。 把这一堆小文件合并,变成一个整体的文件,到此map 端工作完成。-->cleanup
Fetcher{ fetch( 通过nodemanager提供的shuffle服务.读取map产生的结果文件中,指定的分区信息 ) }----->加载到内存或者磁盘(小的放内存 一般是磁盘)----->Memger 文件合并(归并排序,相同key放在一起)----->一个大文件
&Integer.MAX_VALUE 与上整数最大值。01111111111111111111111 0与任何数都是 0 1与任何数都是1, 所以只要 &Integer.MAX_VALUE就是取绝对值