接上一篇讲解:http://blog.csdn.net/mrcharles/article/details/50465626

map任务:溢写阶段

正如我们在执行阶段看到的一样,map会使用Mapper.Context.write()将map函数的输出溢写到内存中的环形缓冲区 (MapTask.MapOutputBuffer)。缓冲区的大小是固定的,通过mapreduce.task.io.sort.mb (default:
100MB)指定。
任何时候当这个缓冲区将要充满的时候(mapreduce.map.
sort.spill.percent
: 默认80% ),溢写将会被执行(这是一个并行过程,使用的是单独的线程,缓冲池还可以继续被写入)。如果溢写线程太慢,而缓冲区又忙了的话,map()就会暂停执行而等待。
溢写线程执行下面的动作:
  1. 创建一个溢写记录SpillRecord 和一个FSOutputStream 文件输出流(本地文件系统)
  2. 内存内排序缓冲中的块:输出的数据会使用快排算法按照partitionIdx,
    key排序
  3. 排序之后的输出会分割成为分区:每一个分区对应一个reduce
  4. 分区序列化写到本地文件

有多少个reduce任务呢?

一个job的ReduceTasks 的数量是通过配置mapreduce.job.reduces参数设置的

一个输出元组的分割指数是多少?

输出元组的分割指数指的是分区的指数。在 Mapper.Context.write()内部被指定:

partitionIdx = (key.hashCode() & Integer.MAX_VALUE) % numReducers
随着输出元组以元数据的形式保存在环形缓冲区。用户可以通过配置mapreduce.job.partitioner.class参数自己定制partitioner 

我们什么时候运行combiner

如果用户制定了一个特定的combiner ,那么,在溢写线程写出到文件之前,会在每一个分区含有元组数据的地方执行combiner 通常,我们做了如下事情:

  1. 创建一个用户指定的Reducer.class实例(用户指定的combiner )
  2. 创建一个Reducer.Context:输出将会保存在本地文件系统
  3. 运行Reduce.run():请看reduce
    任务的描述

Map任务:执行结束

在执行阶段结束的时候,溢写线程最后被触发,细节上,我们作如下事情:

  1. 排序,溢写最后没有被溢写的元组数据
  2. 开始SHUFFLE 相
注意,每一次环形缓冲区将要慢时,达到溢写的百分比的时候,我们就会得到一个溢写文件(溢写记录+输出文件)。每一个溢写文件包含若干分区(分段)

map执行后时期:洗牌shuffle

在一个map任务完成的最后时刻,所有的溢写文件会被合并一个分区文件,与相应的reducer对应。mapreduce.io.sort.merge参数控制合并流一次的数量,默认是100。如果至少有3个溢写文件,combiner将会再次执行。如果只有一个或者两个溢写文件,再次执行combiner从而减少map输出的数据量的大小已经没有什么效果,没有必要再次执行combiner了。分区输出文件通过http的方式提供给reducer。

Merger合并

略粗糙,望帮助大家

Charles 于2016-01-06  Phnom Penh



版权说明:
本文由Charles Dong原创,本人支持开源以及免费有益的传播,反对商业化谋利。
CSDN博客:http://blog.csdn.net/mrcharles
个人站:http://blog.xingbod.cn
EMAIL:charles@xingbod.cn


MapReduce 图解流程超详细解答(2)-【map阶段】的更多相关文章

  1. MapReduce 图解流程超详细解答(1)-【map阶段】

    转自:http://www.open-open.com/lib/view/open1453097241308.html 在MapReduce中,一个YARN  应用被称作一个job, MapReduc ...

  2. CF468C Hack it! 超详细解答

    CF468C Hack it! 超详细解答 构造+数学推导 原文极简体验 CF468C Hack it! 题目简化: 令\(f(x)\)表示\(x\)在十进制下各位数字之和 给定一整数\(a\)构造\ ...

  3. MapReduce 图解流程

    Anatomy of a MapReduce Job In MapReduce, a YARN application is called a Job. The implementation of t ...

  4. JDK的下载及安装教程图解(超详细哦~)

    一.本人电脑系统介绍及JDK下载途径 1.先说明一下我的电脑为win10系统,64位操作系统~ 2.我选择下载的JDK版本为1.8版本.给大家来两个下载渠道,方便大家的下载~ JDK官网:https: ...

  5. MapReduce与Yarn 的详细工作流程分析

    MapReduce详细工作流程之Map阶段 如上图所示 首先有一个200M的待处理文件 切片:在客户端提交之前,根据参数配置,进行任务规划,将文件按128M每块进行切片 提交:提交可以提交到本地工作环 ...

  6. [转]超详细图解:自己架设NuGet服务器

    本文转自:http://diaosbook.com/Post/2012/12/15/setup-private-nuget-server 超详细图解:自己架设NuGet服务器 汪宇杰          ...

  7. SVN入门图解教程(超详细)

    SVN入门图解教程(超详细) 一.总结 一句话总结: 二.SVN入门教程 1. 什么是SVN SVN全名Subversion,即版本控制系统.SVN与CVS一样,是一个跨平台的软件,支持大多数常见的操 ...

  8. 超详细SQL SERVER 2016跨网段和局域网发布订阅配置图解和常见问题

    原文:超详细SQL SERVER 2016跨网段和局域网发布订阅配置图解和常见问题 转载标明出处:http://blog.csdn.net/u012861467 前方高能,要有点耐心,图片较多,注意在 ...

  9. Linux服务器上迁移项目路径,修改nginx配置,迁移及备份MongoDB数据库流程 (超详细)!!!

    缘由:客户服务器项目路径不是很合理,导致Jenkins自动部署时还需要添加路径后再更新部署,所以需要把项目路径统一和规范化. 迁移项目路径,保证路径合规,同时做好备份和迁移.迁移后先安装好依赖. 项目 ...

随机推荐

  1. [JZOJ6347] 【NOIP2019模拟2019.9.8】ZYB玩字符串

    题目 题目大意 有一个字符串\(p\).一开始字符串\(s\)为空串. 接下来进行若干次操作:在\(s\)的某个空隙中插入\(p\). 给出操作后的\(s\),问长度最小的\(p\). 思考历程 感觉 ...

  2. Windows netsh

    用法: netsh [-a AliasFile] [-c Context] [-r RemoteMachine] [-u [DomainName\]UserName] [-p Password | * ...

  3. 一张图轻松掌握 Flink on YARN 应用启动全流程(上)

    Flink 支持 Standalone 独立部署和 YARN.Kubernetes.Mesos 等集群部署模式,其中 YARN 集群部署模式在国内的应用越来越广泛.Flink 社区将推出 Flink ...

  4. 异或前缀和——cf1186C

    很思维的题,b的1个数和c的1个数相差为偶数时,必定有偶数个不同 反之必定有奇数个不同 #include <iostream> #include <cstdlib> #incl ...

  5. CF919D Substring (dag dp)

    传送门 解题思路 感觉这种题都是套路,首先缩点判了环(没看见自环挂了一次..),然后设\(f[x][i]\)表示到了\(x\),\(i\)这个字母走过的最长距离,然后拓扑排序更新即可. 代码 #inc ...

  6. jquery学习笔记(五):AJAX

    内容来自[汇智网]jquery学习课程 5.1 ajax AJAX 是与服务器交换数据的艺术,它在不重载全部页面的情况下,实现了对部分网页的更新. AJAX = 异步 JavaScript 和 XML ...

  7. ORM(Object/Relation Mapping)框架简介

    ORM 框架简介 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关 ...

  8. PAT甲级——A1123 Is It a Complete AVL Tree【30】

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  9. Eclipse 中安装 CDT 插件编写 C/C++

    使用到的软件 1.Eclipse 开发工具 2.MinGW 编译器 一.Eclipse 中安装 CDT 插件 打开 Eclipse 插件市场 搜索 CDT,并找到如下的插件.插件的版本名字可能不太一样 ...

  10. WPF 实现 TextBox 只能输入数字并且不能使用拷贝功能

    1.代码页需要在键盘按下事件中对输入文字进行筛选,代码如下: private void tbxGoToPage_PreviewKeyDown(object sender, KeyEventArgs e ...