剖析Hadoop和Spark的Shuffle过程差异(一)
一、前言
对于基于MapReduce编程范式的分布式计算来说,本质上而言,就是在计算数据的交、并、差、聚合、排序等过程。而分布式计算分而治之的思想,让每个节点只计算部分数据,也就是只处理一个分片,那么要想求得某个key对应的全量数据,那就必须把相同key的数据汇集到同一个Reduce任务节点来处理,那么Mapreduce范式定义了一个叫做Shuffle的过程来实现这个效果。
二、编写本文的目的
本文旨在剖析Hadoop和Spark的Shuffle过程,并对比两者Shuffle的差异。
三、Hadoop的Shuffle过程
Shuffle描述的是数据从Map端到Reduce端的过程,大致分为排序(sort)、溢写(spill)、合并(merge)、拉取拷贝(Copy)、合并排序(merge sort)这几个过程,大体流程如下:
上图的Map的输出的文件被分片为红绿蓝三个分片,这个分片的就是根据Key为条件来分片的,分片算法可以自己实现,例如Hash、Range等,最终Reduce任务只拉取对应颜色的数据来进行处理,就实现把相同的Key拉取到相同的Reduce节点处理的功能。下面分开来说Shuffle的的各个过程。
Map端做了下图所示的操作:
1、Map端sort
Map端的输出数据,先写环形缓存区kvbuffer,当环形缓冲区到达一个阀值(可以通过配置文件设置,默认80),便要开始溢写,但溢写之前会有一个sort操作,这个sort操作先把Kvbuffer中的数据按照partition值和key两个关键字来排序,移动的只是索引数据,排序结果是Kvmeta中数据按照partition为单位聚集在一起,同一partition内的按照key有序。
2、spill(溢写)
当排序完成,便开始把数据刷到磁盘,刷磁盘的过程以分区为单位,一个分区写完,写下一个分区,分区内数据有序,最终实际上会多次溢写,然后生成多个文件
3、merge(合并)
spill会生成多个小文件,对于Reduce端拉取数据是相当低效的,那么这时候就有了merge的过程,合并的过程也是同分片的合并成一个片段(segment),最终所有的segment组装成一个最终文件,那么合并过程就完成了,如下图所示
至此,Map的操作就已经完成,Reduce端操作即将登场
Reduce操作
总体过程如下图的红框处:
1、拉取拷贝(fetch copy)
Reduce任务通过向各个Map任务拉取对应分片。这个过程都是以Http协议完成,每个Map节点都会启动一个常驻的HTTP server服务,Reduce节点会请求这个Http Server拉取数据,这个过程完全通过网络传输,所以是一个非常重量级的操作。
2、合并排序
Reduce端,拉取到各个Map节点对应分片的数据之后,会进行再次排序,排序完成,结果丢给Reduce函数进行计算。
四、总结
至此整个shuffle过程完成,最后总结几点:
Regcode.prototype.draw = function(dom, callback = function (www.yongshiyule178.com/) {}) { // 绘图
// 获取canvas dom
if (!this.paint) { // 如果没有2d对象,再进行赋值操作
this.canvas = dom; // 保存到this指针,方便使用
if (!this.canvas) return;
this.paint =www.enzuo178.com this.canvas.getContext(www.yingka178.com'2d'); // 保存到this指针,方便使用
if (!this.paint) return;
// 回调函数赋值给this,方便使用
this.callback = callback;
}
// 随机画布颜色,使用背景色
let colors = this.getColor(this.www.huarenyl.cn backgroundColor);
this.paint.fillStyle = www.maituyul1.cn`rgba(${colors[www.tiaotiaoylzc.com]}, ${colors[www.dfgjpt.com]}, ${colors[2]}, 0.8)`;
// 绘制画布
this.paint.fillRect(0, 0, this.canvas.width,www.yongshi123.cn this.canvas.height);
1、shuffle过程就是为了对key进行全局聚合
2、排序操作伴随着整个shuffle过程,所以Hadoop的shuffle是sort-based的
转载于:https://www.cnblogs.com/qwangxiao/p/10485121.html
剖析Hadoop和Spark的Shuffle过程差异(一)相关推荐
- 大数据开发:剖析Hadoop和Spark的Shuffle过程差异
一.前言 对于基于MapReduce编程范式的分布式计算来说,本质上而言,就是在计算数据的交.并.差.聚合.排序等过程.而分布式计算分而治之的思想,让每个节点只计算部分数据,也就是只处理一个分片,那么 ...
- Hadoop学习笔记—10.Shuffle过程那点事儿
Hadoop学习笔记-10.Shuffle过程那点事儿 一.回顾Reduce阶段三大步骤 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步骤,其中在Reduc ...
- Hadoop重点难点:Shuffle过程中的环形缓冲区
点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 这篇文章来自一个读者在面试过程中的一个问题,Hadoop在shuffle过程中使用了一个数据结构- ...
- Hadoop计算中的Shuffle过程
2019独角兽企业重金招聘Python工程师标准>>> Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce,Shuffle是必须要了解的 ...
- 【Big Data - Hadoop - MapReduce】通过腾讯shuffle部署对shuffle过程进行详解
摘要: 通过腾讯shuffle部署对shuffle过程进行详解 摘要:腾讯分布式数据仓库基于开源软件Hadoop和Hive进行构建,TDW计算引擎包括两部分:MapReduce和Spark,两者内部都 ...
- Spark的shuffle机制
Spark的shuffle机制 最近在面试大数据开发工程师,面某B公司的时候问到了Spark的shuffle机制,并且问和MR的shuffle有什么样的区别,当时答得不太好,决定好好研究这个玩意儿,网 ...
- Shuffle过程介绍
摘要:腾讯分布式数据仓库基于开源软件Hadoop和Hive进行构建,TDW计算引擎包括两部分:MapReduce和Spark,两者内部都包含了一个重要的过程-Shuffle.本文对Shuffle过程进 ...
- Spark 之 Shuffle
Shuffle 在Spark中Shuffle的目的是为了保证每一个key所对应的value都会汇聚到同一个分区上去聚合和处理. Spark 中的 Shuffle 操作的特点 只有 Key-Value ...
- 第25课 Spark Hash Shuffle源码解读与剖析
第25课: Spark Hash Shuffle源码解读与剖析 Spark 2.1x 现在的版本已经没有Hash Shuffle的方式,那为什么我们还要讲解HashShuffle源码的内容呢?原因有3 ...
最新文章
- linux的 计划任务机制,自己带节奏
- Fedora 19下Guacamole的安装使用
- python 图像分割_Python怎么实现图片分割?
- golang正则表达式
- python2与python3在absolute import的区别
- 曾经成功的敏捷团队为什么失败?
- 又快又简单的sql2005分页存储过程
- Python数据库访问公共组件及模拟Http请求
- SAP Spartacus forms.scss的引用问题
- 学习笔记(56):Python实战编程-Menu
- 详解 Qt 串口通信程序全程图文 (2)
- 【重点 递归版】剑指offer——面试题16:反转链表
- python/pytorch中的一些函数介绍
- Amoeba 实现Mysql的读写分离
- 基于RRT算法的路径规划实现(matlab)
- SSIM(structural similarity index) ---图像质量评价指标之结构相似性
- IAT HOOK、EAT HOOK和Inline Hook
- Centos6-防火墙的基本配置
- 使用Cookies登录网站--登录豆瓣网站
- 计算机操作系统—信号
热门文章
- Java小结(四)——折半查找、选择排序、冒泡排序
- 汇编语言EQU伪指令
- 去中心化钱包CoinU基本介绍,你想知道的都有。
- Android adb无线调试脚本
- Python之区块链简单记账本实现
- Oracle预言机项目发展概览
- elasticsearch备份恢复(单机集群)
- Android实现文字一个一个显示出来
- matlab3dimshow_matlab利用MATLAB嵌套函数表示3D作图
- python 堆栈溢出_python - 使用CFFI释放内存时,“ MemoryError:堆栈溢出”是什么意思? - 堆栈内存溢出...