转载: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. Python-S9-Day99——Web前端框架之Vue.js

    01课程安排 02let和const: 03 箭头函数 04 对象的单体模式 05 Node.js介绍和npm操作 06 Webpack,babel介绍和Vue的第一个案例 01课程安排 1.1 ht ...

  2. [转]核函数K(kernel function)

    1 核函数K(kernel function)定义 核函数K(kernel function)就是指K(x, y) = <f(x), f(y)>,其中x和y是n维的输入值,f(·) 是从n ...

  3. c++ STL sort struct comp

    详细解说 STL 排序(Sort) http://www.cppblog.com/mzty/archive/2005/12/15/1770.html 详细解说 STL 排序(Sort) 作者Winte ...

  4. 详解 MySQL 的计划任务

    注意:5.1以后才支持! 让MYSQL定期执行指定的一条命令.功能类似于crontab. 1. 检查你的MYSQL是否开了这个功能 SHOW VARIABLES LIKE 'event_schedul ...

  5. cmake 版本升级

    1.在网址 https://cmake.org/files/v3.1/下载   cmake-3.1.0.tar.gz 2.解压 3.执行  ./configure 4.执行 make 5. 执行   ...

  6. Linux(Centos) 搭建ReviewBoard

    一.官方安装手册 reviewboard 的安装用户手册:猛击这里 二.常用安装步骤 2.1.安装httpd,+ mod_wsgi, fastcgi, or mod_python yum -y int ...

  7. WebService 序列化和反序列化

    参考了Fish LI的Xml读取文章,写了XML序列化和反序列化的文章. 序列化:把实体列转化成XML.反序列化:把XML按一定的规则转化成需要的实体列. 序列化和反序列化化使用到的类, using ...

  8. Android build code command

    make bootimage -j8 make systemimage -j8

  9. java模拟一次简单的sql注入

    在数据库中生成 一个用户表  有用户名 username 和密码password 字段 并插入两组数据 正常的sql查询结果 非正常查询途径返回的结果 下面用一段java代码 演示一下用户登录时的sq ...

  10. LeetCode OJ-- Longest Common Prefix

    https://oj.leetcode.com/problems/longest-common-prefix/ 在多个string的集合中,找出所有string的最长公共前缀. 从头开始 index ...