Spark Shuffle大揭秘
什么是Shuffle:
Shuffle中文翻译为“洗牌”,需要Shuffle的关键原因是某种具有共同特征的数据需要最终汇聚到一个计算节点上进行计算。
Shuffle面临的问题:
1. 数据量非常大;
2 数据如何分类,及如何Partition,Hash、Sort、钨丝计划
3. 负载均衡(数据倾斜)
4. 网络传输效率,需要在压缩和解压缩做出权衡,序列化和反序列化也是需要考虑的问题。
Hash Shuffle:
1. Key不能是Array
2. Hash Shuffle不需要排序,从理论上就节省了Hadoop MapReduce中进行Shuffle需要排序时候的时间浪费,因为实际生产环境有大量不要排序的Shuffle类型。
思考:不要排序的Hash Shuffle是否一定比不需要排序的Sort额度 Shuffle速度更快? 不一定,如果数据规模比较小的情况下,Hash Shuffle会比Sorted Shuffle速度快(很多)!但是如果数据量大,此时Sorted Shuffle一般会比Hash Shuffle快(很多)。
3. 每个ShuffleMapTask会根据key的哈希值计算出当前的key需要写入的Partition,然后把决定后的结果写入单独的文件,此时会导致每个Task产生R(指下一个Stage的并行度)个文件,如果当前的Stage中有M个ShuffleMapTask,则会M*R个文件。
注意:Shuffle操作绝大多数都要通过网路,如果Mapper和Reducer在同一台机器上,此时只需要读取本地磁盘即可。
Hash Shuffle的两大死穴:第一:Shuffle前会产生大量的小文件到磁盘之上,此时会产生大量耗时低效的IO操作;第二:由于内存中需要保存海量的文件操作句柄和临时缓存信息,如果数据量比较庞大的话,内存不可承受,出现OOM等问题。
为了改善上述问题(同时打开太多文件导致Write Handler内存使用过大以及过多文件导致大量的随机读写带来的效率低下的磁盘IO操作),后来推出了Consalidate机制,来把小文件合并,此时Shuffle时产生的文件数量为cores*R,对于ShuffleMapTask的数量明显多于同时可用的并行cores的数量的情况下,Shuffle产生的文件大幅减少,会极大减低OOM的可能。
为此Spark推出了Shuffle Pluggable开发框架,方便系统升级的时候定制Shuffle功能模块,业方面第三方系统改造人员根据实际的业务场景来开发具体最佳的Shuffle模块;核心接口ShuffleManager,具体默认的实现由HashShuffleManager、SortShuffleManager等,Spark1.6.0中具体的配置如下:

为什么需要Sort-Based Shuffle?
1. Shuffle一般包含两个阶段任务:第一部分,产生Shuffle数据的阶段(Map阶段,额外的补充,需要实现ShuffleManager中getWriter来写数据(数据可以以BlockManager写到Memory、Disk、Tachyon等,例如像非常快的Shuffle,此时可以考虑把数据写在内存中,但是内存不稳定,建议采用MEMOrY_AND_DISK方式)),第二部分,使用Shuffle数据的阶段(Reduce阶段,额外的补充,需要实现ShuffleManager的getReader,Reader会向Driver去获取上一个Stage产生的Shuffle数据)。
2.Spark的Job会被划分成很多Stage:
如果只有一个Stage,则这个Job就相当于只有一个Mapper阶段,当然不会产生Shuffle,适合于简单的ETL;
如果不止一个Stage,则最后一个Stage就是最终的Reducer,最左侧的第一个Stage就仅仅是整个Job的Mapper,中间所有的任意一个Stage是其父Stage的Reducer且是其子Stage的Mapper。
3.Spark Shuffle在最开始的时候只支持Hash-base Shuffle:默认Mappper阶段会为Reducer阶段的每一个Task单独创建一个文件来保存该Task中要使用的数据,但是在一些情况下(例如数据量非常大的情况)会造成大量文件(M*R,其中M代表Mapper中的所有的并行任务的数量,R代表)
3.






Spark Shuffle大揭秘的更多相关文章
- Hadoop MapReduce概念学习系列之shuffle大揭秘(十九)
shuffle是非常重要!一定要深入理解和多实践. 缓存,分组,排序,转发,这些都是mr的shuffle. Soga 我想得到按流量来排序,而且还是倒序,怎么达到实现呢?这就牵扯到排序的的问题 默认是 ...
- Spark Streaming揭秘 Day3-运行基石(JobScheduler)大揭秘
Spark Streaming揭秘 Day3 运行基石(JobScheduler)大揭秘 引子 作为一个非常强大框架,Spark Streaming兼具了流处理和批处理的特点.还记得第一天的谜团么,众 ...
- Spark Shuffle原理、Shuffle操作问题解决和参数调优
摘要: 1 shuffle原理 1.1 mapreduce的shuffle原理 1.1.1 map task端操作 1.1.2 reduce task端操作 1.2 spark现在的SortShuff ...
- Spark Shuffle数据处理过程与部分调优(源码阅读七)
shuffle...相当重要,为什么咩,因为shuffle的性能优劣直接决定了整个计算引擎的性能和吞吐量.相比于Hadoop的MapReduce,可以看到Spark提供多种计算结果处理方式,对shuf ...
- Spark shuffle详细过程
有许多场景下,我们需要进行跨服务器的数据整合,比如两个表之间,通过Id进行join操作,你必须确保所有具有相同id的数据整合到相同的块文件中.那么我们先说一下mapreduce的shuffle过程. ...
- MapReduce Shuffle原理 与 Spark Shuffle原理
MapReduce的Shuffle过程介绍 Shuffle的本义是洗牌.混洗,把一组有一定规则的数据尽量转换成一组无规则的数据,越随机越好.MapReduce中的Shuffle更像是洗牌的逆过程,把一 ...
- Spark Shuffle实现
Apache Spark探秘:Spark Shuffle实现 http://dongxicheng.org/framework-on-yarn/apache-spark-shuffle-details ...
- 大数据实时处理-基于Spark的大数据实时处理及应用技术培训
随着互联网.移动互联网和物联网的发展,我们已经切实地迎来了一个大数据 的时代.大数据是指无法在一定时间内用常规软件工具对其内容进行抓取.管理和处理的数据集合,对大数据的分析已经成为一个非常重要且紧迫的 ...
- [Spark性能调优] 第四章 : Spark Shuffle 中 JVM 内存使用及配置内幕详情
本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified Mem ...
随机推荐
- JSP笔记01——尝试
JSP ————> servlet 我的第1个Java Web应用程序——index.jsp 我的第2个Java Web应用程序——welcome-file 我的第3个Java Web应用程序— ...
- node中session存储与销毁,及session的生命周期
1.首先在使用session之前需要先配置session的过期时间等,在入口文件app.js中 app.use(express.session({ cookie: { maxAge: config.g ...
- console.log()方法中%s的作用
一.console.log("log信息"); 二.console.log("%s","first","second") ...
- windows 服务安装报错
使用windows服务开发的定时任务,在win7上都运行良好,在windows server 2008上运行报错,报错信息如下 错误应用程序名称: GCWindowsService.exe,版本: 1 ...
- Android电容屏(二):驱动调试分析【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/7833383 以goodix的gt8105为例 一.总体架构 硬件部分:先看一个总体的图 ...
- Myeclipse中Tomcat的两种部署方式
一.在Myeclipse软件中部署 1. 在Myeclipse中,创建好工程后,在Myeclipse菜单栏中选择 Windows -> Preferences -> Myeclipse - ...
- linux学习(rz和sz命令的安装和使用)
lrzsz的安装 [root@spark1 ~]# yum install lrzsz rz用法 终端直接输入rz,出现文件选择对话框,选择要上传的文件就ok sz用法 下载filename文件: s ...
- linux基础(3)-java安装
安装jdk1.8 [root@spark1 usr]# mkdir java #创建java目录 通过WinSCP将jdk-8u77-linux-x64.tar.gz传到/usr/java目录下 [r ...
- SSIS之序列容器
序列容器是一种十分简单,但使用非常广泛的容器,它可以对控制流的任务流组件进行结构化处理,把一些业务相关的任务组件,放到一个序列容器中,使整个包看起来更加整洁.美观,就如同我们家里的书柜.衣柜似的,把不 ...
- spring boot: Annotation 注解之@Target的用法介绍
前言 目前,越来越多的架构设计在使用注解,例如spring3.0.struts2等框架.让我们先来看看注解的定义.如下是一段使用了JDK 5 Annotation @Target的代码: @Targe ...