接上一篇讲解: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. android studio toolbar遮挡住下面控件内容

    只需要在该控件布局(content_***.xml)加入: app:layout_behavior="@string/appbar_scrolling_view_behavior" ...

  2. Java中怎样实现字符串截取

    使用substring()对字符串进行截取: /** * str.indexOf()查找下标 * substring();//字符串截取 * length();//字符串长度 * */ @Test p ...

  3. MySQL基本命令脚本

    一.基本命令 1.启动服务 说明:以管理员身份运行cmd 格式:net start 服务名称 示例:net start mysql57 2.停止服务 说明:以管理员身份运行cmd 格式:net sto ...

  4. java中的break continue

    break语句 在任何循环语句的主体部分,均可用break控制循环的流程.break用于强行退出循环,不执行循环中剩余的语句.(break语句也在switch语句中使用) public class B ...

  5. Windows 关闭win32 控制台

    {     fclose(pf); BOOL ret = FreeConsole(); }

  6. 【转载】opencl中设备内存

    地址空间限定符 一般的内核代码中,里面的内核参数或声明变量时,都会有地址空间限定符 地址空间限定符,地址空间限定符的主要作用是指出数据应该保存在哪个地方 地址空间限定符有4个: 全局内存: 限定符:_ ...

  7. Systm.IO.File.cs

    ylbtech-Systm.IO.File.cs 1.程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5619 ...

  8. js基础应用-打字机,震动窗口

    js基础应用一,窗口震动 html+js代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

  9. Python flask 构建可扩展的restful apl✍✍✍

    Python flask 构建可扩展的restful apl  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...

  10. Python Fabric模块详解

    Python Fabric模块详解 什么是Fabric? 简单介绍一下: ​ Fabric是一个Python的库和命令行工具,用来提高基于SSH的应用部署和系统管理效率. 再具体点介绍一下,Fabri ...