环形缓存区是mapreduce中map阶段处理和存储数据的后半段过程,主要负责处理map()方法输出的kv数据
其内部工作原理如下图
1.环形缓存区的本质是一个缓存数组,即byte[] kvbuff,默认大小为100M
2.最初时,equator在数组最前端,可以将数组想象为环形,首尾相接
3.然后此时equator就既在数组开头,又在数组末尾
4.此时kv数据传进来之后,equator会将kv数据向右进行存储,同时,equator会将此kv对应的元数据向左存储
5.元数据的大小为4字节,存储的分别是(keyStart,valueStart,value length,partition)
6.buffindex指针指向的是最新输入的一个kv数据的末尾位置,随着kv数据的输入,buffindex逐渐向右推移
7.kvindex指针指向的是元数据的末尾位置,随着元数据的增加,kvindex逐步向左推移
8.当kv数据与元数据的大小达到整个数据大小的80%后,此时equator通过setEquator方法计算出一个具体的值,将equator移动到剩余的20%的空间的某个位置
9.此时已经到达80%,缓存区内的数据开始溢出,此时若继续存入数据,kv会从新的equator位置向右存储,元数据会从新的equator位置向左存储
这时又分为两种情况:
9.1:若溢出还没完成,剩余20%的空间已经被填满,此时就会发生阻塞,阻止kv数据继续进入缓存数组,必须等到溢出完成,阻塞锁才会释放,此时原来的数据会被清除,数据即可再次存入
9.2:若溢出已经完成,剩余20%的空间还未存满,此时会将原本的数据清除,数据继续从新equator的位置开始存储
10.直到文件中的数据被全部读取完,此过程则会停止,否则会一直循环执行