shuffle机制详解

2023-11-08

在这里插入图片描述


将map输出作为输入传递给reducer的过程称为shuffle。

Shuffle过程包含在Map和Reduce两端

map阶段大致过程为
  写数据,分区,排序,将属于同一分区的输出合并一起写在磁盘上。

每个map任务都有一个环形内存缓冲区用于存储任务输出。环形内存缓冲区默认大小为100M。

map开始产生输出数据时,先将数据写入缓冲区中,当缓冲区中数据达到阈值(默认为0.8)时,就开始把数据溢出到本地磁盘,溢出的文件成为spill文件。溢出的过程中,map输出的数据会继续写入缓冲区,如果此时缓冲区已经满了,那么map会等待缓冲区有空间时再进行写入。

在将缓冲区的数据写入到磁盘之前,首先会根据数据最终要传的reducer对缓冲区的数据进行分区,在每个分区中,数据按key进行排序(快速排序)。如果有combiner函数,则会在排序后的输出上运行,使得map的输出结果更加紧凑。

把所有溢出的文件进行一次合并,合并成一个已分区且已排序的输出文件。

reduce阶段大致过程为
  复制,合并。

reducer通过HTTP得到输出文件的分区。

reduce有少量的复制线程(默认是5个),可以并行的从map上复制数据。

Reduce可能需要从多个map任务中获取数据,因此只要多个map中的一个完成,reduce便可以从map复制数据。如果map的输出数据较小,会直接复制到内存;否则,map输出被复制到磁盘。当内存缓冲区达到阈值或达到map输出阈值时,合并后溢出写出到磁盘。如果指定combiner,那么会在合并期间运行它以降低写入磁盘的数据量。

最后会排序合并这些溢出文件。

简单总结:

  先把数据写入到缓冲区,每次写入之前要计算分区号,当要溢写时,会对数据进行排序,根据key进行排序(可以自己定义按什么来排序),溢写时如果设置了combiner(适合加减场景),会先对溢写的数据进行合并,每次溢写会生成spill文件,将多个spill文件进行合并,合并成总的文件,合并时如果片段数量大于等于3,这个时候combiner会继续运行,如果不大于则不会运行。在maptask输出时,还可以指定将合并后的数据以压缩格式输出。最终将文件写入磁盘。

  Reduce阶段,通过shuffle线程拷贝指定分区的数据,拷贝后的数据会先在shuffle线程内存中进行合并,如果内存不够,也会进行多次溢写,最终对所有的数据进行一次归并排序。


  1)环形缓冲区:

    排序方式:快排+字典序

    默认溢写阈值:80%

    默认大小:100M

    合理的调节环形缓冲区大小以及溢写阈值是一种常见的 MR 优化手段

  2)切片机制

    a) 简单地按照文件的内容长度进行切片

    b) 切片大小,默认等于 Block 大小

    c) 切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

    切片大小公式:max(0,min(Long_max,blockSize))



一、分区

  1. 分区是在MapTask中通过Partitioner来计算分区号

  2. Partitioner的初始化

    ①计算总的分区数partitions,取决于用户设置的reduceTask的数量

    ②partitions>1,默认尝试获取用户设置Partitioner,如果用户没有定义,那么会使用HashPartitioner

    HashPartitioner根据key的hashcode进行计算,相同的key以及hash值相同的key会分到一个区

    ②partitions<=1,默认初始化一个Partitioner,这个Partitioner计算的所有的区号都为0

  3. 注意

    通常在Job的设置中,希望将数据分为几个区,就设置reduceTask的数量为对应的数量!

    partitions=设置的reduceTask的数量,0<=分区器计算的区号 < partitions

二、排序

  1. 排序是MR框架在shuffle阶段自动进行

  2. 在MapTask端发生两次排序,在排序时,用户唯一可以控制的是提供一个key的比较器

  3. 设置key的比较器

    ①用户可以自定义key的比较器,自定义的比较器必须是一个RawComparator类型的类

      重点是实现compareTo()方法

    ②用户通过key,让key实现WritableComparable接口,系统自动提供一个比较器

    重点是实现compareTo()方法

  4. 排序的分类

    全排序: 对所有的数据进行排序,指生成一个结果文件,这个结果文件整体有序

    部分排序: 最终生成N个结果文件,每个文件内部整体有序

    二次排序: 在对key进行比较时,比较的条件为多个

    辅助排序: 在进入reduce阶段时,通过比较key是否相同,将相同的key分为1组

三、分组

  1. 分组通过分组比较器,对进入reduce的key进行对比,key相同的分为一组,一次性进入Reducer,被调用reduce方法

  2. 分组比较器的设置

    ①用户可以自定义key的分组比较器,自定义的比较器必须是一个RawComparator类型的类

      重点是实现compareTo()方法

    ②如果没有设置key的分组比较器,默认采取在Map阶段排序时,key的比较器

  3. Reduce的细节

    在进入reduce(),Reducer会自动实例化一个key,value,这个key-value在Redcuer工作期间,一直是一个不变的对象

    每次迭代,reducer会把读到的新的key-value的属性值赋值给key-value!

四、Combiner

  1. Combiner的本质是一个Reducer,对key-value进行合并,Combiner的作用就是对map端的输出先做一次合并,以减少map和reduce结点之间的数据传输量,以提高网络IO性能。

  2. Combiner 和 Reducer的区别

    Combiner在shuffle阶段运行

    Reducer在reduce阶段运行

  3. Combiner适用于 +,-操作,不适合 *,/操作

  4. Combiner的运行时机

    在MapTask端: ①每次从缓冲区将数据溢写到磁盘之前,如果设置了Combiner,数据会被Combine之后再溢写到磁盘

    ②在MapTask最后的merge阶段,如果溢写的片段数据>=3,,如果设置了Combiner,在生成最终的数据时,也会先执行Combine之后再溢写到磁盘

    在ReduceTask端: ③shuffle线程从多个MapTask读取同一个分区的数据,之后进行合并,在合并时,如果shuffle所使用的内存不够,也会将部分数据临时溢写到磁盘,此时如果设置了Combiner,数据会被Combine之后再溢写到磁盘

  5. Combiner的本质目的是为了减少MR在运行期间的磁盘IO和网络IO

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shuffle机制详解 的相关文章

随机推荐

  • 10个顶级的CSS UI开源框架

    随着CSS3和HTML5的流行 我们的WEB页面不仅需要更人性化的设计理念 而且需要更酷的页面特效和用户体验 作为开发者 我们需要了解一些宝贵的CSS UI开源框架资源 它们可以帮助我们更快更好地实现一些现代化的界面 包括一些移动设备的网页
  • 模式识别课程:目标检测①创建PASCAL VOC数据集

    title 目标检测 创建数据集 目标检测实验报告 检测所用软硬件 云服务器 硬件 macOS或者windows电脑 软件 pycharm 生成的测试集 云服务器 滴滴云 https www didiyun com activity htm
  • 二.信息化与系统集成技术

    项目经理考试学习笔记 二 信息化与系统集成技术 考试 6分左右 信息化5分左右 1 信息化 1 1 政府信息化与电子政务 1 2 企业资源管理 ERP 1 2 1 ERP的定义 1 2 3 ERP的思想 1 3 客户管理关系 CRM 职能
  • Git中忽略文件常见内容, git中的一些操作记录

    jar war class lock DS Store swp out target iml ipr iws bak settings classpath project metadata idea logs log dependency
  • Win10 开发者模式开启

    使用注册表方式 建立一个注册表DWORD为1键值 HKLM SOFTWARE Microsoft Windows CurrentVersion AppModelUnlock AllowAllTrustedApps建立一个注册表DWORD为1
  • 短视频、直播程序、一对一社交app--老外们玩嗨的程序竟然多半来自“中国的程序猿们开发”...

    短视频 直播程序 一对一社交app 老外们玩嗨的程序竟然多半来自 中国的程序猿们开发 在过去的2017年可以说是中国短视频 直播程序 一对一社交app极为火爆的一年 国内市场的厮杀一直没有停止过 很多投资者在国内那是一片红海 短视频 直播程
  • STM32 学习笔记 -- Keil 5调试STM32控制器,出现错误提示“Error: Encountered an improper argument”的原因参考

    最近在使用MDK调试STM32控制器 当下载完成 需要使用ST LINK进行程序仿真时 MDK偶尔会出现错误提示 Error Encountered an improper argument 大概意思是说 错误 遇到不正确的参数 出现这种情
  • 音频放大器的设计

    摘要 进入21世纪以后 各种便携式的电子设备成为了电子设备的一种重要的发展趋势 从作为通信工具的手机 到作为娱乐设备的MP3播放器 已经成为差不多人人具备的便携式电子设备 所有这些便携式的电子设备的一个共同点 就是都有音频输出 也就是都需要
  • 微信小程序模板消息发送功能实现

    前言 发送微信模板消息首先需要用户去绑定openId和serverOpenId才能推送模板消息 1 微信配置项 1 微信小程序根据前端返回的code去获取unionId和openid 通过type 0的接口去请求 2 用户获取到unionI
  • JasperSoft Studio的使用(1)——软件介绍及创建空白模板

    最近工作中需要用到报表打印 像pdf中多个table的展示 一个List在新的一页中显示列头等 JasperSoft 正好可以满足这些需求 所以记录一下 用以分享 软件介绍 JasperSoft Studio是一个面向 JasperRepo
  • 华为Java社招面试经历详解【已拿到offer】

    这篇文章主要介绍了华为Java社招面试经历 详细记录了华为java面试的流程 相关面试题与参考答案 需要的朋友可以参考下 看看自己能答对多少 如果能回答70 的题目 就大胆去阿里以及各互联网公司试试身手吧 本篇建议大家收藏 备用 华为Jav
  • Qt Creator release版本进行调试

    一 背景 我们在进行性Qt Creator 进行开发时 想要调试代码 通常是只需要编译 debug 版本的程序 但对于很多大型项目 引用外部第三方库中难免只存在release版本的动态库 所以 当我们的程序进行debug 调试时 往往会编译
  • window零基础部署langchain-ChatGLM

    一 介绍 从0开始安装运行langchain ChatGLM 6b int4模型 主要是版本要配套不然特别容易报错 我的机器配置CPU是Intel Core i7 7700HQ CPU 2 80GHz 2 80 GHz GPU8G 二 相关
  • 腾讯 13 年,我所总结的Code Review终极大法

    关注并星标腾讯云开发者 每周1 鹅厂工程师带你审判技术 第3期 林强 Code Review 我都 CR 些什么 谚语曰 Talk Is Cheap Show Me The Code 知易行难 知行合一难 嘴里要讲出来总是轻松 把别人讲过的
  • 蓝桥杯C/C++省赛:颠倒的价牌

    目录 题目描述 思路分析 AC代码 题目描述 小李的店里专卖其它店中下架的样品电视机 可称为 样品电视专卖店 其标价都是4位数字 即千元不等 小李为了标价清晰 方便 使用了预制的类似数码管的标价签 只要用颜色笔涂数字就可以了 这种价牌有个特
  • Java之美[从菜鸟到高手演变]之设计模式四

    在阅读过程中有任何问题 请及时联系 egg 邮箱 xtfggef gmail com 微博 http weibo com xtfggef 转载请说明出处 http blog csdn net zhangerqing 其实每个设计模式都是很重
  • html表格标签使用与注意事项

    表格的基本标签 场景 在网页中以行 列的单元格的方式整齐展示和数据 如 学生成绩表 基本标签 标签名 作用 table 表格的整体 用于包含多个tr tr 表格的每行 用于包含多个td td 表格单元格 用于包含内容 注意事项 嵌套关系为
  • 微信小程序分包加载,分包加载的优势

    微信小程序分包加载 有时候我们的小程序太大 首次打开小程序的时候会比较慢 可以进行分包处理 按照功能的划分 拆分成几个分包 让用户在操作小程序的时候按需下载资源 用户在进入某些页面的时候才去下载相应的资源 加载这个功能对应的分包 使用分包可
  • springboot设置logback-spring.xml的加载路径

    springboot将应用程序打包成jar以后 默认是将logback spring xml放在jar包里面根路径下 图 如果我们需要springboot加载jar包外部的logback spring xml应该怎么做了 例如我们想加载与x
  • shuffle机制详解

    将map输出作为输入传递给reducer的过程称为shuffle Shuffle过程包含在Map和Reduce两端 map阶段大致过程为 写数据 分区 排序 将属于同一分区的输出合并一起写在磁盘上 每个map任务都有一个环形内存缓冲区用于存