一、shuffle介绍

1 、shuffle就是洗牌弄乱的意思,shuffle代表map 输出 到reduce 的整个过程,他解决的问题就是如何将多个map task的输出,作为多个reduce task 的输入,下面就来看看shffler是如何对map的输出结果排序,处理,分组成reduce的输入的。

2 、shuffle和partition和combiner的关系是包含关系,shuffle过程包含partition

二、shuffle的整个流程

2.1 介绍

1 shuffle整个过程可以分两部分,一部分是在map端,一部分是在reduce端

2 当我们跑mapreduce时候,maptask和reducetask大部分情况是分布在不同的节点上的,这时候reducetask执行需要通过网络去copy其他节点上的maptask任务的结果,这对网络的要求是非常大的,所以我们期望shuffle过程目标是

1 将map的输出完整的传输达到reduce端

2 尽可能减少传输到来消耗

3 降低磁盘I/O

2.2 shuffle过程

Map端的 Shuffle 阶段

2.2.1输入数据

数据分片(默认128M,HDFS一个块的大小),MAP处理(文章中每个词出现一次记录一次,key:词,value:1),MAP输出会先输出到内存上。

2.2.2partition函数

在写入缓存前,会调用partition函数,partition会根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理分组,最后写到硬盘上。(partition过程后面会详细说)

2.2.3 Spill 阶段

            每个 Map 任务都有一个用来写入输出数据的循环内存缓冲区(默认大小为 100MB),当缓冲区中的数据量达到一个特定阈值(默认是 80%)时,系统将会启动一个后台线程,把缓冲 区中的内容写到磁盘中(即 Spill 阶段)。在写磁盘过程中,Map 输出继续被写到缓冲区中,但如果在此期间缓冲区被填满,那么 Map 任务就会阻塞直到写磁盘过程完成。

2.2.3combiner 操作

          可有可无,combiner 是一种特殊的reduce,他的作用在于优化map和reduce之间的数据传输数量,比如查文章中单词出现的次数,mao执行完了都是一个词,编辑标记一个1,3combiner 操作可以把同样的词进行累加,map输出数据根据分区排序完成后,在写入文件之前会执行一次combine操作(前提是作业中设置了这个操作);

2.2.5 Sort 阶段

多路归并排序 虽然已经partition函数进行分组,但是还需要对输出内容进行排序,方便后面处理

2.2.5 copy阶段

map任务执行完成, 写入文件结束后Reduce任务就会来复制任务需要的数据,在 TaskTracker 的本地磁盘上的数据会被多个Reduce任务复制(是哪个任务就数据就复制哪一块,partition任务已经分好

Reduce 端的 Shuffle 阶段

2.2.7 Merge 阶段

将 Map 端复制过来的数据先放入内存缓冲区中,Merge 有 3 种形式,分别是内存到内存,内存到磁盘,磁盘到磁盘。默认情况下,第一种形式不启用,第二种形式一直在运行(Spill 阶段),直到结束,第三种形式生成最终的文件(Merge 阶段)。

2.2.8 Reduce 阶段

最终文件可能存在于磁盘中,也可能存在于内存中,但是默认情况下是位于磁盘中的。当 Reduce 的输入文件已定,整个 Shuffle 阶段就结束了,然后就是 Reduce 执行,把结果放到 HDFS 中(Reduce 阶段)。

2.3 partition过程

2.2.2已经简单介绍了,partition其实就确认数据应该被分到哪个reduce上,那partition是怎么分的呢?默认的算法which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks

key.hashCode() & Integer.MAX_VALUE    &运算避免出现负值,然后对结果进行取余。

当然也可以extends Partitioner自定义partition函数

2.4combiner 过程

为了减少优化网络传输,在写入文件之前会执行一次combine操作,打个比方,统计文章单词出现的次数。Map 执行完了之后是每个词记录一次,例如:key: hi   value:1   ,这时候hi这个次如果出现多次占用空间就比较大,combine操作可以汇总这些词的词数 ,最后如果有100个hi ,汇总后就是key: hi   value:100 大大减少了网络的传输。

MapReduce (Shuffle,partition,combiner,Spill )相关推荐

  1. Hadoop入门(九)Mapreduce高级shuffle之Combiner

    一.Combiner的出现 (1)为什么需要进行Map规约操 作 在上述过程中,我们看到至少两个性能瓶颈: (1)如果我们有10亿个数据,Mapper会生成10亿个键值对在网络间进行传输,但如果我们只 ...

  2. MapReduce内部shuffle过程详解(Combiner的使用)

    Maptask调用一个组件FileInputFormat FileInputFormat有一个最高层的接口 --> InputFormat 我们不需要去写自己的实现类,使用的就是内部默认的组件: ...

  3. mapreduce的shuffle机制(来自学习笔记)

    3. MAPREDUCE原理篇(2) 3.1 mapreduce的shuffle机制 3.1.1 概述: MapReduce中,mapper阶段处理的数据如何传递给reduce阶段,是MapReduc ...

  4. MapReduce:Shuffle过程详解

    MapReduce:Shuffle过程详解 1.Map任务处理 1.1 读取HDFS中的文件.每一行解析成一个<k,v>.每一个键值对调用一次map函数.                & ...

  5. 从MapReduce的Shuffle原理 进行 生产参数调优

    文章目录 1.mapreduce的过程上图 2.map 切分输入文件 3.环形缓冲区 3.1 原理 3.2 生产调优 3.2.1 mapreduce.task.io.sort.mb(default:1 ...

  6. 谷歌技术三宝之MapReduce(转)

    江湖传说永流传:谷歌技术有"三宝",GFS.MapReduce和大表(BigTable)! 谷歌在03到06年间连续发表了三篇很有影响力的文章,分别是03年SOSP的GFS,04年 ...

  7. MapReduce 之shuffle过程

    我们知道在MapReduce程序在map阶段和reduce阶段之间,会进行shuffle操作.那么我们来详细分析一下shuffle的过程或者原理 在MapTask调用Mapper#map方法之前,会构 ...

  8. Hadoop---Google MapReduce(转)

    1. MapReduce是干啥的 因为没找到谷歌的示意图,所以我想借用一张Hadoop项目的结构图来说明下MapReduce所处的位置,如下图. Hadoop实际上就是谷歌三宝的开源实现,Hadoop ...

  9. mapreduce优化之自定义combiner

    自定义combiner map端合并数据,减少网络io 一.普通的combiner 二.自定义combiner,实现自由合并 map端合并数据,减少网络io 前言:在map端使用combiner合并数 ...

最新文章

  1. 用户查看订单信息php,php – 以编程方式获取用户刚刚在Ubercart中完成的订单
  2. 美国康奈尔大学计算机科学的教授,美国康奈尔大学教授Robbert van Renesse访问并做学术报告...
  3. 学python那本书比较好-Python初学者最应该读的8本书
  4. 开源PaaS工具CloudFoundry落地阿里云
  5. centos 更改mysql数据库目录位置_centos更改MySQL数据库目录位置
  6. php获取表单后如何保存到数据库中,php – 如何将数据从HTML表单保存到WordPress中的数据库表?...
  7. [ASP,VB] - 利用ASP调用API COM接口实现开关机
  8. java sftp 密钥_通过密钥 SFTP (二):启用没有 Shell 访问权限的 SFTP 账户
  9. java doprivileged_【转】关于AccessController.doPrivileged
  10. java 反射 本类_Java 反射 Class类
  11. #控制台大学课堂点名问题_草率了!大学课堂点名新招数来袭,逃课的一个也没有躲过...
  12. redis持久化RDB与AOF
  13. 线下商店销量预测挑战赛
  14. Ubuntu18.04关闭休眠(自动休眠与手动休眠)
  15. Vpro 相机操作类
  16. 如何使用禅道集成钉钉
  17. web前端需要学习什么?需要掌握什么技术
  18. UG二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突
  19. C++中的long long和__int64类型
  20. EasyRecovery年中狂欢还没结束,震惊

热门文章

  1. 三国群英传8修改器(附怎么用)
  2. 代码显示苹果 iOS 16.2 将允许 iPhone 更频繁刷新“实时活动”,但也更加耗电
  3. Hello Spring boot
  4. matlab 图像 高通滤波器,基于matlab数字图像处理之高通滤波器
  5. python 语音转文字_《奇巧淫技》系列-Python实现 语音转文字??非也!!是文字转语音,DIY你想要的萝莉音!!!-Go语言中文社区...
  6. redis缓存数据库中zset数据结构底层算法实现原理:ziplist 和 skiplist
  7. slice()和splice()
  8. excel表格汇总数据怎么做?
  9. QEMU 模拟Arm A9开发板
  10. DIY一个1pA超微电流测试器,非常易懂!