Hadoop源码分析(MapTask辅助类,II)
| 有了上面Mapper输出的内存存储结构和硬盘存储结构讨论,我们来细致分析MapOutputBuffer的流程。首先是成员变量。最先初始化的是作业配置job和统计功能reporter。通过配置,MapOutputBuffer能够获取本地文件系统(localFs和rfs),Reducer的数目和Partitioner。 SpillRecord是文件spill.out{spill号}.index在内存中的相应抽象(内存数据和文件数据就差最后的校验和),该文件保持了一系列的IndexRecord,例如以下图: IndexRecord有3个字段,各自是startOffset:记录偏移量。rawLength:初始长度,partLength:实际长度(可能有压缩)。 SpillRecord保持了一系列的IndexRecord,并提供方法用于加入记录(没有删除记录的操作,由于不须要)。获取记录,写文件,读文件(通过构造函数)。
io.sort.record.percent是kvindices和kvoffsets占用的空间比例(缺省是0.05)。 前面的分析我们已经知道kvindices和kvoffsets,假设记录数是N的话,它占用的空间是4N*4bytes,依据这个关系和io.sort.record.percent的值。我们能够计算出kvindices和kvoffsets最多能有多少个记录。并分配相应的空间。參数io.sort.spill.percent指示当输出缓冲区或kvindices和kvoffsets记录数量到达相应的占用率的时候。会启动spill,将内存缓冲区的记录存放到硬盘上。softBufferLimit和softRecordLimit为相应的字节数。 值对<key, value>输出到缓冲区是通过Serializer串行化的。这部分的初始化跟在上面输出缓存后面。接下来是一些计数器和可能的数据压缩处理器的初始化,可能的Combiner和combiner工作的一些配置。 先看生产者。MapOutputBuffer.collect的主要流程是: 这就是说。假设kvstart不等于kvend,系统正在spill,否则。kvstart==kvend。系统处于普通工作状态。 事实上在代码中。我们能够看到非常多kvstart==kvend的推断。 以下我们分情况,讨论kvstart,kvend和kvindex的配合。初始化的时候。它们都被赋值0。 假设spill条件满足,那么,kvindex的值会赋给kvend(这是kvend不等于kvstart),从kvstart和kvend的大小关系,我们能够知道记录位于数组的那一部分(左边是kvstart<kvend的情况,右边是另外的情况)。Spill结束的时候,kvend值会被赋给kvstart,kvend==kvstart又又一次满足。同一时候。我们能够发现kvindex在这个过程中没有变化。新的记录还是写在kvindex指向的位置,然后,kvindex=kvnect,kvindex移到下一个可用位置。 Collect在处理<key。value>输出时。会处理一个MapBufferTooSmallException,这是value的串行化结果太大。不能一次放入缓冲区的指示,这样的情况下我们须要调用spillSingleRecord,特殊处理。 很多其它精彩内容请关注:http://bbs.superwu.cn 关注超人学院微信二维码: 关注超人学院java免费学习交流群: |
Hadoop源码分析(MapTask辅助类,II)的更多相关文章
- Hadoop源码分析之数据节点的握手,注册,上报数据块和心跳
转自:http://www.it165.net/admin/html/201402/2382.html 在上一篇文章Hadoop源码分析之DataNode的启动与停止中分析了DataNode节点的启动 ...
- Hadoop源码分析之Configuration
转自:http://www.it165.net/admin/html/201312/2178.html org.apache.hadoop.conf.Configuration类是Hadoop所有功能 ...
- hadoop源码分析(2):Map-Reduce的过程解析
一.客户端 Map-Reduce的过程首先是由客户端提交一个任务开始的. 提交任务主要是通过JobClient.runJob(JobConf)静态函数实现的: public static Runnin ...
- Hadoop源码分析之FileSystem抽象文件系统
Hadopo提供了一个抽象的文件系统模型FileSystem,HDFS是其中的一个实现. FileSystem是Hadoop中所有文件系统的抽象父类,它定义了文件系统所具有的基本特征和基本操作. Fi ...
- Hadoop源码分析之产生InputSplit文件过程
用户提交 MapReduce 作业后,JobClient 会调用 InputFormat 的 getSplit方法 生成 InputSplit 的信息. 一个 MapReduce 任务 ...
- HADOOP源码分析之RPC(1)
源码位于Hadoop-common ipc包下 abstract class Server 构造Server protected Server(String bindAddress, int port ...
- Hadoop 源码分析(二四)FSNamesystem
以下轮到FSNamesystem 出场了. FSNamesystem.java 一共同拥有4573 行.而整个namenode 文件夹下全部的Java 程序总共也仅仅有16876 行,把FSNames ...
- Hadoop源码分析(mapreduce.lib.partition/reduce/output)
Map的结果,会通过partition分发到Reducer上.Reducer做完Reduce操作后,通过OutputFormat,进行输出.以下我们就来分析參与这个过程的类. Mapper的结果, ...
- Hadoop源码分析之读文件时NameNode和DataNode的处理过程
转自: http://blog.csdn.net/workformywork/article/details/21783861 从NameNode节点获取数据块所在节点等信息 客户端在和数据节点建立流 ...
随机推荐
- CentOS6永久修改主机名称
1.修改network vi /etc/sysconfig/network 修改HOSTNAME值 2.修改hosts vi /etc/hosts 修改中间的那个localhost 3.使用hostn ...
- PID控制原理和算法
闭环控制是根据控制对象输出反馈来进行校正的控制方式,它是在测量出实际与计划发生偏差时,按定额或标准来进行纠正的.比如控制一个电机的转速,就得有一个测量转速的传感器,并将结果反馈到控制路线上.提到闭环控 ...
- linux基础命令学习(六)文件的特殊属性
Linux chattr命令用于改变文件属性. 这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式: a:让文件或目录仅供附加用途. b:不更新文件或目录的最后存取 ...
- tortoise git常用功能
1.打tag TortoiseGit -> show log -> 选中版本 -> create tag at this version... TortoiseGit -> p ...
- 密钥登陆Linux服务器
Linux VPS/服务器的使用越来越多,Linux的安全问题也需要日渐加强.我们远程线上的服务器,通常是通过密码方式(ip+帐号+密码,可能还多一个ssh端口)登录,如果密码不够强壮,那么系统将是灰 ...
- setTimeout你知多少
假期这么快就结束了,其实对我来说没什么影响,因为我一周才两节课,对于课多的同学来说,我天天在休假,不要羡慕哟~ 但休假并不代表闲着,还是得苦逼的编代码,唉..一入程序深似海.. 不管学得多少,还是总 ...
- MySQL year函数
mysql的日期函数,示例如下:
- 硬件加速 Hardware Accelerated 绘制
官方文档中对硬件加速的描述 原文地址:http://developer.android.com/guide/topics/graphics/hardware-accel.html Beginning ...
- SQL 服务没有及时响应启动或控制请求”的解决方法
解决方法很简单:卸载删除跟IIS相关的几个漏洞安全更新补丁即可,包括KB939373.KB2290570和KB2124261.卸载微软安全更新补丁的方法:打开控制面板的“添加删除程序”面板,勾 ...
- PHP防抓取数据curl 解决方法
1.使用Snoopy或curl传搜索引擎爬虫的USERAGENT值. 查看搜索引擎爬虫的USERAGENT值:http://www.cnblogs.com/grimm/p/5068092.html ( ...