1. 定义
      shuffle是指map任务输出到reduce任务输入的过程。
2. 目的
        在Hadoop集群中,大部分map任务与reduce任务在不同的节点执行。因此,reduce任务在执行时需要跨节点去获取map的输出结果。如果集群上有很多作业,那么网络资源消耗会很严重,需要最大化减少不必要的资源。另外,如果map的输出和reduce的输入只是简单的磁盘读写操作,那么磁盘IO时间将对作业完成时间产生较大影响,应该减少磁盘IO的影响。
      所以,shuffle阶段的目的有两个:
     <1>在跨节点获取map输出时,尽可能减少网络带宽不必要的消耗。
     <2>优化内存使用,减少磁盘IO操作。
3. shuffle过程解析

图 1
3.1 Map输出    
       上图是官方给出的shuffle的流程图,但是上图中的“partition, sort amd spill to disk”过程并没有说明partition、sort和spill在哪个过程进行,难以理解。因此,我画了另外一张图,解释上图左半边的流程(map task),如图:
图 2
(1) Partition操作
       map的输出结果是多个键值对(key/value),将由reduce合并,而集群中有多个reduce,该由哪个reduce负责处理这些键值对?答案是MapReduce提供了Partitioner接口
       Partitioner接口可以根据key或value、以及reduce的数量来决定当前的map输出结果由哪个reduce处理。(默认方式是,计算key的哈希值,再对reduce数量取模。比如,计算得到的值是0,则指定第一个reduce处理)
       所以,得到map输出后,进行partition操作,从而指定某个reduce处理该输出结果。
(2) Spill操作
       map输出时使用的内存缓冲区有大小限制,默认是100MB。当输出结果很多时,内存就会被填满,因此需要将缓冲区的数据写入磁盘,然后重新使用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill(溢出写)
       溢出写由单独一个线程负责,不影响往缓冲区写map结果的线程。所以在溢出写的过程中,map输出结果会继续被写入内存。当缓冲区的数据达到阈值(默认是80%,由属性 io.sort.spill.percent 设定),溢出写线程启动,对这80%的内存进行溢出写操作。
       在溢出写把map结果写到磁盘之前,需要进行两个重要的操作:sort(排序)和combine(合并)
       sort是把这80%的map结果按照key排序。
       另外,因为一个map的输出结果会由不同的reduce处理(不同的key通过partition操作计算出来的值不同),所以要将属于同一个reduce处理的输出结果进行combine操作。
(3)Merge操作
       每次溢出写都会在磁盘上生成一个溢出写文件,如果map输出结果很大,那么将会生成多个溢出写文件。(当map任务完成时,会把内存缓冲区中最后的结果也写到一个溢出写文件中)。为了方便后续阶段reduce来获取输出结果,这些溢出写文件将会被合并成一个文件,这就是merge操作。
最后,合并后的溢出写文件被放在TaskTracker的本地目录下,map端的工作结束。
3.2 Reduce输入
reduce端不断通过RPC从JobTracker获取map任务是否完成的信息。如果reduce端得到通知,shuffle的后半段就开始了。
(1) copy阶段
        reduce任务启动一些copy线程(默认值是5个线程,可设置mapred.reduce.parallel.copies属性),通过HTTP方式把TaskTracker目录下的map输出结果复制到内存缓冲区(这里缓冲区大小比map端灵活,是基于JVM的heap size设置的。因为在copy阶段不执行reduce操作,所以绝大部分内存都给copy线程使用)。当缓冲区中的数据达到阈值,就进行溢出写操作(与map端类似)。
(2) sort阶段
       其实,这里的所说的sort更恰当的说是merge,因为排序是在map端进行的,而这个阶段的任务是合并来自多个map端的输出结果。比如,有50个map输出,而合并因子是10(由io.sort.factor属性设置),那么将进行5趟合并,每趟合并10个文件。最后合并成5个文件。
(3) reduce阶段
对sort阶段生成的文件执行reduce操作,把输出结果放到HDFS。


Hadoop学习笔记(四):Shuffle阶段相关推荐

  1. Hadoop学习笔记—10.Shuffle过程那点事儿

    Hadoop学习笔记-10.Shuffle过程那点事儿 一.回顾Reduce阶段三大步骤 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步骤,其中在Reduc ...

  2. Hadoop学习笔记(四)HDFS部分下

    Hadoop学习笔记(四)HDFS部分下 一.HDFS 的数据流 1.1 HDFS的写数据流程 客户端通过 Distributed FileSystem 模块向 NameNode 请求上传文件,Nam ...

  3. Hadoop学习笔记—4.初识MapReduce

    一.神马是高大上的MapReduce MapReduce是Google的一项重要技术,它首先是一个 编程模型 ,用以进行大数据量的计算.对于大 数据量的计算,通常采用的处理手法就是并行计算.但对许多开 ...

  4. Hadoop学习笔记—11.MapReduce中的排序和分组

    Hadoop学习笔记-11.MapReduce中的排序和分组 一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出 ...

  5. Hadoop学习笔记—13.分布式集群中节点的动态添加与下架

    Hadoop学习笔记-13.分布式集群中节点的动态添加与下架 开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如 ...

  6. Hadoop学习笔记-集群部署

    前期准备 使用三台主机,每台安装好JDK和Hadoop 参考:Hadoop学习笔记–单台安装 同步小技巧 scp–rsync–编写xsync scp是主机之间安全拷贝数据的工具,一般的语法为 scp ...

  7. Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

    Hadoop学习笔记-20.网站日志分析项目案例(一)项目介绍 网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edis ...

  8. hadoop学习笔记-目录

    以下是hadoop学习笔记的顺序: hadoop学习笔记(一):概念和组成 hadoop学习笔记(二):centos7三节点安装hadoop2.7.0 hadoop学习笔记(三):hdfs体系结构和读 ...

  9. Hadoop学习笔记—16.Pig框架学习

    Hadoop学习笔记-16.Pig框架学习 一.关于Pig:别以为猪不能干活 1.1 Pig的简介 Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin, ...

  10. 华清远见fs4412开发板学习笔记(四)

    fs4412开发板学习笔记(四) 今天的课程安排 1.复习 1.1 VIM 编辑器 [1] vim + filename 打开 [2] 工作模式 命令模式 编辑模式 底行模式 [3] 模式切换 命令- ...

最新文章

  1. Linux Centos 上一些常用的命令
  2. Docker mongo副本集环境搭建
  3. 50个运维必会的常识和操作
  4. SAP Spartacus 用户认证的实现
  5. mongoose操作mongodb
  6. 服务器磁盘系统,服务器磁盘阵列与操作系统
  7. Mongodb Replica Configure
  8. javascript 本地对象和内置对象_详解 JavaScript 面向对象
  9. 最小花费(信息学奥赛一本通-T1344)
  10. getSystemService
  11. 计算机专业本科毕业转行会计,大学里就业最难的5个专业,毕业后难找工作,很多同学都转行了!...
  12. neo4j3.0 java使用_neo4j-java连接
  13. JNI介绍及简单实例
  14. 1046. 划拳(15)-PAT乙级真题
  15. jQuery first()和last()函数示例
  16. hdu 2642 Stars 树状数组
  17. 全国大学计算机硕士专业排名,计算机考研院校排名:中国大学计算机学科排行榜...
  18. 【CDN加速】项目前端性能优化之开启CDN加速
  19. 1020寒星孤月-蛇形矩阵
  20. 语音合成 GAN Vocoders 总览

热门文章

  1. Xamarin University-----Xamarin Mobile Certification Exam考试经历(还没写完)
  2. 利用 filter 机制 给 静态资源 url 加上时间戳,来防止js和css文件的缓存,利于开发调试...
  3. 线性代数学习笔记(十四)
  4. usaco1.5.3(sprime)
  5. helperdialect mysql_Mybatis使用pageHelper步骤(动态分页)
  6. 同一个网址,根据pc跟移动端,跳到对应页面
  7. /dev/mapper/VolGroup-lv_root空间爆满解决
  8. Sql语句查询某列A相同值的另一列B最大值的数据
  9. 21. 总是让比较函数在等值情况下返回false
  10. Redis----windows下配置和运行