shuffle的环形缓冲区
map----shuffle过程—reduce
元数据:描述原始数据的数据 原始数据在缓冲区的位置
1)分区信息
2)原始数据key的起始位置
3)原始数据value的起始位置
4)value的长度信息
长度是固定的(4 * 16)
原始数据:序列化的数据 map输出的key 、value的键值对
环形缓冲区 byte []
缓冲区中:分界线 辨识元数据和原始数据的
缓冲区的默认大小:
< property>
< name>mapreduce.task.io.sort.mb< /name>
< value>100< /value>
< /property>
缓冲区的数据达到一定的量之后会溢写到磁盘 spill
有个溢写阈值:总体容量占比0.8 100M*0.8=80M
< property>
< name>mapreduce.map.sort.spill.percent< /name>
< value>0.80< /value>
< /property>
如果80M没有溢写完成,20M写完,写处于阻塞状态,等待80M的空间释放
溢写之前先排序:按照分区排序(相同分区的数据在一起),再按照map的key排序(相同的key在一起)(快速排序)
排序:分区,元数据 元数据的顺序
每个分区内按照map的key 原始数据读取 调整元数据的位置
溢写:根据元数据写原始数据(元数据排完序就没有意义了)
溢写完成后对溢写文件进行归并(merge)然后在进行归并排序,按照分区归并(把每一个分区的数据放在一起),再在每一个分区内部排序(按照map输出的key排的序)
**reducetask在一个maptask执行完成开始启动
MRappmaster:进度
reducetask是从MRappmaster获取maptask进度的
reducetask会先启动多线程取maptask端fetch数据(抓取对应分区的数据)
copy数据的线程数,默认启动5个线程
< property>
< name>mapreduce.reduce.shuffle.parallelcopies< /name>
< value>5< /value>
< /property>
将抓取过来的每一个分区的数据进行归并排序
将每一个分区的数据发送给reducetask的时候进行分组,
**
底层源码
@InterfaceAudience.LimitedPrivate({"MapReduce"})
@InterfaceStability.Unstable
public static class MapOutputBuffer<K extends Object, V extends Object>
implements MapOutputCollector<K, V>, IndexedSortable {
//分区编号
private int partitions;
//配置文件 JobConf配置文件对象 job.setJarByClass(Driver.class)
//job.xml中 <name> <value>
private JobConf job;
private TaskReporter reporter;
//map输出的key和value的类型
private Class<K> keyClass;
private Class<V> valClass;
private RawComparator<K> comparator;
private SerializationFactory serializationFactory;
private Serializer<K> keySerializer;
private Serializer<V> valSerializer;
private CombinerRunner<K,V> combinerRunner;
private CombineOutputCollector<K, V> combineCollector;
// Compression for map-outputs
private CompressionCodec codec;
// k/v accounting
private IntBuffer kvmeta; // metadata overlay on backing store
int kvstart; // marks origin of spill metadata
int kvend; // marks end of spill metadata
int kvindex; // marks end of fully serialized records
//分界线 元数据/序列化(map输出的原始数据)
int equator; // marks origin of meta/serialization
int bufstart; // mar