MapReduce中的Shuffle

在MapReduce框架中,shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性能高低直接影响了整个程序的性能和吞吐量。

Shuffle是MapReduce框架中的一个特定的phase,介于Map phase和Reduce phase之间,当Map的输出结果要被Reduce使用时。输出结果须要按key哈希。而且分发到每个Reducer上去。这个过程就是shuffle。因为shuffle涉及到了磁盘的读写和网络的传输,因此shuffle性能的高低直接影响到了整个程序的执行效率。

下图描写叙述了MapReduce算法的整个流程,当中shuffle phase是介于Map phase和Reduce phase之间:

在Hadoop, 在mapper端每次当memory buffer中的数据快满的时候, 先将memory中的数据, 按partition进行划分, 然后各自存成小文件, 这样当buffer不断的spill的时候, 就会产生大量的小文件。

所以Hadoop后面直到reduce之前做的全部的事情事实上就是不断的merge, 基于文件的多路并归排序,在map端的将同样partition的merge到一起, 在reduce端, 把从mapper端copy来的数据文件进行merge, 以用于终于的reduce

多路归并排序, 达到两个目的。

merge, 把同样key的value都放到一个arraylist里面;sort, 终于的结果是按key排序的。

这个方法扩展性非常好, 面对大数据也没有问题, 当然问题在效率, 毕竟须要多次进行基于文件的多路归并排序,多轮的和磁盘进行数据读写。

Spark的Shuffle机制

Spark中的Shuffle是把一组无规则的数据尽量转换成一组具有一定规则的数据。

Spark计算模型是在分布式的环境下计算的。这就不可能在单进程空间中容纳全部的计算数据来进行计算。这样数据就依照Key进行分区。分配成一块一块的小分区,打散分布在集群的各个进程的内存空间中,并非全部计算算子都满足于依照一种方式分区进行计算。

当须要对数据进行排序存储时。就有了又一次依照一定的规则对数据又一次分区的必要。Shuffle就是包裹在各种须要重分区的算子之下的一个对数据进行又一次组合的过程

在逻辑上还能够这样理解:因为又一次分区须要知道分区规则。而分区规则依照数据的Key通过映射函数(Hash或者Range等)进行划分,由数据确定出Key的过程就是Map过程,同一时候Map过程也能够做数据处理。比如,在Join算法中有一个非常经典的算法叫Map Side Join,就是确定数据该放到哪个分区的逻辑定义阶段。Shuffle将数据进行收集分配到指定Reduce分区,Reduce阶段依据函数对对应的分区做Reduce所需的函数处理。

Spark中Shuffle的流程



* 首先每个Mapper会依据Reducer的数量创建出对应的bucket,bucket的数量是M×R,当中M是Map的个数,R是Reduce的个数。

* 其次Mapper产生的结果会依据设置的partition算法填充到每个bucket中去。

这里的partition算法是能够自己定义的,当然默认的算法是依据key哈希到不同的bucket中去。

* 当Reducer启动时,它会依据自己task的id和所依赖的Mapper的id从远端或是本地的block manager中取得对应的bucket作为Reducer的输入进行处理。

这里的bucket是一个抽象概念,在实现中每个bucket能够对应一个文件。能够对应文件的一部分或是其它等。

转载请注明作者Jason Ding及其出处

GitCafe博客主页(http://jasonding1354.gitcafe.io/)

Github博客主页(http://jasonding1354.github.io/)

CSDN博客(http://blog.csdn.net/jasonding1354)

简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)

Google搜索jasonding1354进入我的博客主页

$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('

    ').addClass('pre-numbering').hide();
    $(this).addClass('has-numbering').parent().append($numbering);
    for (i = 1; i ').text(i));
    };
    $numbering.fadeIn(1700);
    });
    });

【Spark】Spark的Shuffle机制的更多相关文章

  1. Spark Shuffle机制详细源码解析

    Shuffle过程主要分为Shuffle write和Shuffle read两个阶段,2.0版本之后hash shuffle被删除,只保留sort shuffle,下面结合代码分析: 1.Shuff ...

  2. spark的shuffle机制

    对于大数据计算框架而言,Shuffle阶段的设计优劣是决定性能好坏的关键因素之一.本文将介绍目前Spark的shuffle实现,并将之与MapReduce进行简单对比.本文的介绍顺序是:shuffle ...

  3. [Spark内核] 第35课:打通 Spark 系统运行内幕机制循环流程

    本课主题 打通 Spark 系统运行内幕机制循环流程 引言 通过 DAGScheduelr 面向整个 Job,然后划分成不同的 Stage,Stage 是從后往前划分的,执行的时候是從前往后执行的,每 ...

  4. spark性能调优(二) 彻底解密spark的Hash Shuffle

    装载:http://www.cnblogs.com/jcchoiling/p/6431969.html 引言 Spark HashShuffle 是它以前的版本,现在1.6x 版本默应是 Sort-B ...

  5. 打通 Spark 系统运行内幕机制循环流程

    本课主题 打通 Spark 系统运行内幕机制循环流程 引言 通过 DAGScheduelr 面向整个 Job,然后划分成不同的 Stage,Stage 是从后往前划分的,执行的时候是從前往后执行的,每 ...

  6. spark教程(13)-shuffle介绍

    shuffle 简介 shuffle 描述了数据从 map task 输出到 reduce task 输入的过程,shuffle 是连接 map 和 reduce 的桥梁: shuffle 性能的高低 ...

  7. Spark cache、checkpoint机制笔记

    Spark学习笔记总结 03. Spark cache和checkpoint机制 1. RDD cache缓存 当持久化某个RDD后,每一个节点都将把计算的分片结果保存在内存中,并在对此RDD或衍生出 ...

  8. spark中产生shuffle的算子

    Spark中产生shuffle的算子 作用 算子名 能否替换,由谁替换 去重 distinct() 不能 聚合 reduceByKey() groupByKey groupBy() groupByKe ...

  9. spark 源码分析之十二 -- Spark内置RPC机制剖析之八Spark RPC总结

    在spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv中,剖析了NettyRpcEnv的创建过程. Dispatcher.NettyStreamManager.T ...

随机推荐

  1. (第三章)Java内存模型(下)

    一.happens-before happens-before是JMM最核心的概念.对于Java程序员来说,理解happens-before是理解JMM的关键. 1.1 JMM的设计 从JMM设计者的 ...

  2. 自定义PopupWindow动画效果

    public class RollActivity extends Activity { private View view; private Button btn; private PopupWin ...

  3. smbpasswd命令常用选项

    smbpasswd命令的常用方法 smbpasswd -a 增加用户(该账户必须存在于/etc/passwd文件中)smbpasswd -d 冻结用户,就是这个用户不能在登录了smbpasswd -e ...

  4. 【转】NSHashtable and NSMaptable

    本文转自Nidom的博客,原文:<NSHashtable & NSMaptable>   NSSet, NSDictionary, NSArray是Foundation框架关于集合 ...

  5. django: db - many to many

    本讲介绍数据库多对多关系,代码样例继前文使用. 一,在 blog/models.py 中创建对象: # Many-To-Many Example : Authors vs Books class Au ...

  6. angular 指令 要点解析

    指令可以删繁就简前端的js代码,杜绝重复的js代码和html代码. 下面就对指令的重要属性进行罗列 一.restrict  =  'AECM'  分别指该指令标识位于 attribute属性: < ...

  7. Codeforces Round #279 (Div. 2)f

    树形最大上升子序列 这里面的上生子序列logn的地方能当模板使  good #include<iostream> #include<string.h> #include< ...

  8. MongoDB在win7下安装配置

    1.在MongoDB官网下载最新版本,并且安装 2.解压后在MongoDB文件目录下创建data文件夹和log文件夹,并且在log文件夹中新建mongodb.log文件 3.新建一个配置文件mongo ...

  9. JS/CSS/IMG加载顺序关系之DOMContentLoaded事件

    DOMContentLoaded介绍 DOMContentLoaded事件的触发条件是: 将会在“所有的DOM全部加载完毕并且JS加载执行后触发”. 但如果“js是通过动态加载进来的话,是不会影响到D ...

  10. 错误日志类C#

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...