转载:http://blog.csdn.net/HADOOP_83425744/article/details/49560583

http://bigdatadecode.club/MapReduce%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90--%E7%8E%AF%E5%BD%A2%E7%BC%93%E5%86%B2%E5%8C%BA.html

一.什么是Hadoop 环形缓冲区: 
Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方。要想理解MapReduce, Shuffle是必须要了解的。从这周开始,开始学习shuffle的整个过程,今天带来的是hadoop环形缓冲区的理解

二.初始化mr环形缓冲区(maptask.MapOutputBuffer): 
hadoopd的环形缓冲区其实只是一个简单的buffer(),下面我们来看一下MapOutputBuffer的init方法:

private IntBuffer kvmeta; // 存储元数据信息 **注意这是一个intbuffer 存储int  至于元数据为什么都是int,下面会有答案**
byte[] kvbuffer; //环形缓冲区的数组 final int sortmb = job.getInt(JobContext.IO_SORT_MB, 100);//首先通过配置文件得到了环形缓冲区的大小,默认情况下是100M
....................
int maxMemUsage = sortmb << 20; //通过位运算把100m转化成对应的字节
kvbuffer = new byte[maxMemUsage]; //创建一个buffer
bufvoid = kvbuffer.length;
kvmeta = ByteBuffer.wrap(kvbuffer) //通过伪装得到一个元数据数组
.order(ByteOrder.nativeOrder()) //这个数组是int 所以总大小/4
.asIntBuffer(); //100M位例值为26214400
setEquator(0); //设置初始的赤道的位置为0(稍后解释赤道)
bufstart = bufend = bufindex = equator; //初始化buffer参数
kvstart = kvend = kvindex; //初始化meta参数 private void setEquator(int pos) {
final int aligned = pos - (pos % METASIZE); //在这里pos为0, 所以aligned=0
kvindex =
((aligned - METASIZE + kvbuffer.length) % kvbuffer.length) / 4;
}
//

以上,就是整个环形缓冲区的初始化过程,可以简单理解为通过读取配置文件(默认100M)获得一个100M大小的byte数组,然后这个 数组再通过包装,包装成了一个intbuffer 此时,kvbuffer和kvmeta在内存中的指向都是同一个数组,即100m大小的byte数组, 
通过kvindex(26214396)的值和kvmate(26214400)也可以看到,包装之后的kvindex是指向数组的末尾,由此我们也可以大概知道,我们的元数据信息是从末尾到头的顺序写入

三.mr环形缓冲区的结构:

这是环形缓冲区的结构示意图: 
1.整个环形缓冲区以赤道为起点,开始向两边读写数据 
2.之所以元数据信息全部都是整数,是因为 他只存储分区信息(整数)和kvbuffer在数组中的位置,每个元素局信息占16字节4X4 
4.环形缓冲区的数据写入(不考虑spill进行)maptask.MapOutputBuffer.collect(); 
1.根据bufferindex找到key的长度然后序列化之后进行写入

 int keystart = bufindex;
//序列化之后写入buffer,写入后获得新的bufindex
keySerializer.serialize(key);
//此时会判断是否已经连续写完,如果在内存满的时候进行写入,此时有可能空间不足,导致数据写入一半,为了保证数据完全写入此时判断并处理(之后会提到详细过程)
if (bufindex < keystart) {
// wrapped the key; must make contiguous
bb.shiftBufferedKey();
keystart = 0;
}
写入value的原理相同
final int valstart = bufindex;
valSerializer.serialize(value);

2.元数据的写入 
1.元数据的写入比较简单,每次写入都写入一个int型,但是我们要记住,写入的时候的位置,因为我们是从后往前写,

kvmeta.put(kvindex + PARTITION, partition); 
kvmeta.put(kvindex + KEYSTART, keystart); 
kvmeta.put(kvindex + VALSTART, valstart); 
kvmeta.put(kvindex + VALLEN, distanceTo(valstart, valend)); 
// advance kvindex 改变每次index的值 每次4个位置! 
kvindex = (kvindex - NMETA + kvmeta.capacity()) % kvmeta.capacity(); 
四:当写入的buffer的大小达到80% 满足溢写条件的时候,开始溢写 
下周开始进行溢写

正确理解hadoop 2.x 的环形缓冲区: (一) MR环形缓冲区的结构的更多相关文章

  1. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  2. Js位置与大小(1)——正确理解和运用与尺寸大小相关的DOM属性

    在web开发中,不可避免遇到要计算元素大小以及位置的问题,解决这类问题的方法是利用DOM提供的一些API结合兼容性处理来,所有内容大概分3篇左右的文章的来说明.本文作为第一篇,介绍DOM提供的与尺寸大 ...

  3. 【转】正确理解PHP程序编译时的错误信息

    我们编写程序时,无论怎样小心谨慎,犯错总是在所难免的.这些错误通常会迷惑PHP编译器.如果开发人员无法了解编译器报错信息的含义,那么这些错误信息不仅毫无用处,还会常常让人感到沮丧. 编译PHP脚本时, ...

  4. 如何正确理解正则表达式中的分隔符 \b

    前言:好久不见,博客园. 最近在学习研究regex,其中有个特迷惑自己的知识点是分隔符 ( word boundary) [\b] (注:为了方便,后文都以[]来包含字符,并不是reg规则里面的[] ...

  5. Java进阶(七)正确理解Thread Local的原理与适用场景

    原创文章,始自发作者个人博客,转载请务必将下面这段话置于文章开头处(保留超链接). 本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ Th ...

  6. IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理

    1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以“人”为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是整个IM系统都是以长 ...

  7. 正确理解CAP定理

    前言 CAP的理解我也看了很多书籍,也看了不少同行的博文,基本每个人的理解都不一样,而布鲁尔教授得定义又太过的简单,没有具体描述和场景案例分析.因此自己参考部分资料梳理了一篇与大家互相分享一下. 标题 ...

  8. 深入理解Hadoop之HDFS架构

    Hadoop分布式文件系统(HDFS)是一种分布式文件系统.它与现有的分布式文件系统有许多相似之处.但是,与其他分布式文件系统的差异是值得我们注意的: HDFS具有高度容错能力,旨在部署在低成本硬件上 ...

  9. [转] 如何选择正确的Hadoop版本

    Gartner:如何选择正确的Hadoop版本 这份报告的全名是<How to Choose the Right Apache Hadoop Distribution>.主要介绍了企业如何 ...

随机推荐

  1. javascript计算两个时间的差

    function GetDateDiff(startTime, endTime, diffType) { //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式 startTime ...

  2. 快速排序(Quick Sort)及优化

    原理介绍 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成 ...

  3. nginx的进程模型

    nginx采用的也是大部分http服务器的做法,就是master,worker模型,一个master进程管理站个或者多个worker进程,基本的事件处理都是放在woker中,master负责一些全局初 ...

  4. ruby 规整git commit 信息

    实现过程: 1.使用git log 可以获取到所有git commit.对命令加入参数后,可以获取某段时间的log.和只输出log的某些字段.如: [root@localhost crowd-web- ...

  5. 【bzoj4281】[ONTAK2015]Związek Harcerstwa Bajtockiego 树上倍增+LCA

    题目描述 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点.之后你将依次收到k个指令,每个指令包含两个整数d和t,你需要沿着最短路在t步之内(包含t步)走到d点,如果不能走到,则停在 ...

  6. Codeforces Round #330 (Div. 2) B 容斥原理

    B. Pasha and Phone time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  7. 【CF1073D】Berland Fair(模拟)

    题意:初始有t元,每次从1开始买,从1到n依次有n个人,每个人的东西价格为a[i],该人依次能买就买,到n之后再回到1从头开始,问最后能买到的东西数量 n<=2e5,t<=1e18,a[i ...

  8. 【NOIP2009】最优贸易

    描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通 ...

  9. Func<T1, T2, TResult> Delegate 系统Func委托类型

    原文发布时间为:2011-03-25 -- 来源于本人的百度文章 [由搬家工具导入] http://msdn.microsoft.com/en-us/library/bb534647%28v=VS.1 ...

  10. webRTC实战总结

    前言 前段时间一直在忙一个基于WebRTC的PC和移动端双向视频的项目.第一次接触webRTC,难免遇到了许多问题,比如:webRTC移动端兼容性检测,如何配置MediaStreamConstrain ...