# 深入理解 Spark Shuffle 源码
Apache Spark 是一个开源的大数据处理框架,以其高效的内存计算和分布式计算能力而广受欢迎。在 Spark 的执行过程中,Shuffle 是一个关键操作,它涉及到将中间数据从不同的处理节点重新组织,以实现更复杂的数据求解。本文将深入探讨 Spark Shuffle 源码的基本原理,并结合一些代码示例以便更好理解。
## 什么是 Shuff            
                
         
            
            
            
            一、shuffle定义shuffle,即为洗牌的意思,在大数据计算中,无论是mapreduce框架还是spark框架,都需要shuffle,那是因为在计算的过程中,具有某种特征的数据最终需要汇聚在一个节点上进行计算,这些数据是分部在集群中不同的节点上由各自节点进行计算。就比如以workcount为例:    其中数据是分别保存在节点Node1,Node2,Node3上,经过处理            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-17 19:53:45
                            
                                118阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            Background在MapReduce框架中,shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性能高低直接影响了整个程序的性能和吞吐量。Spark作为MapReduce框架的一种实现,自然也实现了shuffle的逻辑,本文就深入研究Spark的shuffle是如何实现的,有什么优缺点,与Hadoop MapRed            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-12-08 08:23:02
                            
                                27阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            Spark Shuffle 源码在划分stage时,最后一个stage称为finalStage,它本质上是一个ResultStage对象,前面的所有stage被称为ShuffleMapStage。 ShuffleMapStage的结束伴随着shuffle文件的写磁盘。 ResultStage基本上对应代码中的action算子,即将一个函数应用在RDD的各个partition的数据集上,意味着一个j            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-08-16 13:35:51
                            
                                35阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            Spark Shuffle 源码剖析概念理论铺垫一、 Spark 分区数量由谁决定Spark source 如果是TextFile() 读取HDFS中的文件,2参数,第一个参数是路径,第二个是指定分区数量如果指定分区数量,0或1,则分区数量的多少取决于文件数量的多少如果没有指定分区数量,默认则是2,如果文件总大小为100m,100/2(分区数量)=50,50为goalSize,如果50会和Hdfs            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-11-29 09:06:15
                            
                                97阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            本文要解决的问题:通过Spark源码学习,进一步深入了解Shuffle过程。Shuffle 介绍在Map和Reduce之间的过程就是Shuffle,Shuffle的性能直接影响整个Spark的性能。所以Shuffle至关重要。从图中得知,Map输出的结构产生在bucket中。而bucket的数量是map*reduce的个数。这里的每一个bucket都对应一个文件。Map对bucket书是写入数据,            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-11-02 00:21:53
                            
                                56阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            标题sortShuffleManager一、注册ShuffleHandle的策略 首先,在shuffle过程中满足以下条件,选择BypassMergeSortShuffleHandle: 1)map端没有聚合操作 2)shuffle read partitions <= spark.shuffle.sort.bypassMergeThreshold(阈值默认为200) 其次,满足以下条件,选            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-11-06 10:44:54
                            
                                45阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            一 、概述我们知道Spark Shuffle机制总共有三种:1.未优化的Hash Shuffle:每一个ShuffleMapTask都会为每一个ReducerTask创建一个单独的文件,总的文件数是S * R,不仅文件数量很多,造成频繁的磁盘和网络I/O,而且内存负担也很大,GC频繁,经常出现OOM。2.优化后Hash Shuffle:改进后的Shuffle,启用consolidation机制,E            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-19 21:04:10
                            
                                84阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            task.run.runTask->ShuffleMapTask.runTask->writer.write writer 有 HashShuffleWriter和SortShuffleWriter 本章分析 HashShuffleWriterShuffle Write/**
   *  Write a bunch of records to this task's output 
             
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-21 08:57:34
                            
                                58阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            # Spark Shuffle 源码分析教程
## 1. 整体流程
下面是实现"Spark Shuffle 源码分析"的整体流程:
```mermaid
pie
    title Shuffle 源码分析
    "理解Shuffle概念" : 20
    "查看Shuffle代码" : 30
    "分析Shuffle实现" : 50
```
```mermaid
gantt            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-06-03 03:18:51
                            
                                56阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            在学Spark之前,我们再回顾一下MapReduce的知识,这对我们理解Spark大有裨益。在大数据的技术分层中,Spark和MapReduce同为计算层的批处理技术,但是Spark比MapReduce要快很多。看看官网是怎么说的Apache Spark。简介Apache Spark是一个统一的大规模数据处理分析引擎。它提供基于Java,Scala, Python和R语言的高级api,并且自动优化            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-05-17 15:06:41
                            
                                72阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            概述所谓Shuffle就是将不同节点上相同的Key拉取到一个节点的过程。这之中涉及到各种IO,所以执行时间势必会较长,Spark的Shuffle在1.2之前默认的计算引擎是HashShuffleManager,不过HashShuffleManager有一个十分严重的弊端,就是会产生大量的中间文件。在1.2之后默认Shuffle改为SortShuffleManager,相对于之前,在每个Task虽然            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-05-28 13:15:50
                            
                                40阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            ShuffleManager(一) 本篇,我们来看一下spark内核中另一个重要的模块,Shuffle管理器ShuffleManager。shuffle可以说是分布式计算中最重要的一个概念了,数据的join,聚合去重等操作都需要这个步骤。另一方面,spark之所以比mapReduce的性能高其中一个 ...            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2021-05-03 23:12:02
                            
                                293阅读
                            
                                                                                    
                                2评论
                            
                                                 
                 
                
                             
         
            
            
            
            .一 .前言二 .Shuffle Write框架设计和实现2.1. BypassMergeSortShuffleWriter2.2. UnsafeShuffleWriter2.3. SortShuffleWriter三 . 输出文件验证3.1. 通用验证代码3.1.1 验证代码3.1.2 断点入口 : org.apache.spark.scheduler.ShuffleMapTask # run            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-18 21:41:01
                            
                                71阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            shuffle读过程源码分析 上一篇中,我们分析了shuffle在map阶段的写过程。简单回顾一下,主要是将ShuffleMapTask计算的结果数据在内存中按照分区和key进行排序,过程中由于内存限制会溢写出多个磁盘文件,最后会对所有的文件和内存中剩余的数据进行归并排序并溢写到一个文件中,同时会记 ...            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2021-05-03 23:11:45
                            
                                1096阅读
                            
                                                                                    
                                2评论
                            
                                                 
                 
                
                             
         
            
            
            
            在使用 Spark 进行计算时,我们经常会碰到作业 (Job) Out Of Memory(OOM) 的情况,而且很大一部分情况是发生在 Shuffle 阶段。那么在 Spark Shuffle 中具体是哪些地方会使用比较多的内存而有可能导致 OOM 呢? 为此,本文将围绕以上问题梳理 Spark 内存管理和 Shuffle 过程中与内存使用相关的知识;然后,简要分析下在 Spark Shuffl            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-10-18 05:24:13
                            
                                127阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            Spark 大会上,所有的演讲嘉宾都认为 shuffle 是最影响性能的地方,但是又无可奈何。之前去百度面试 hadoop 的时候,也被问到了这个问题,直接回答了不知道。这篇文章主要是沿着下面几个问题来开展:1、shuffle 过程的划分?2、shuffle 的中间结果如何存储?3、shuffle 的数据如何拉取过来?Shuffle 过程的划分Spark 的操作模型是基于 RDD 的,当调用 RD            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-06-11 13:03:30
                            
                                106阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            回忆一下,每个Stage的上边界,要么需要从外部存储读取数据,要么需要读取上一个Stage的输出;而下边界,要么是需要写入本地文件系统(需要Shuffle),以供childStage读取,要么是最后一个Stage,需要输出结果。这里的Stage,在运行时的时候就是可以以pipeline的方式运行的一组Task,除了最后一个Stage对应的是ResultTask,其余的Stage对应的都是Shuff            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-06-19 13:39:07
                            
                                236阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            Spark Shuffle原理解析 一:到底什么是Shuffle?         Shuffle中文翻译为“洗牌”,需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节点上进行计算。 二:Shuffle可能面临的问题?运行Task的时候才会产生Shuffle(S            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-06-02 14:18:45
                            
                                128阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            一.hashShuffle在早期的spark中,其shuffle的机制是hashShuffle。在hashShuffle的过程中,每一个shuffleMapTask都会为每一个reduceTask创建一个bucket缓存,shuffleMapTask会对处理后的数据进行partitioner操作(默认是hash partition,即对key进行hashcode再将其值与reduceTask数量进            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-06-19 13:36:05
                            
                                198阅读
                            
                                                                             
                 
                
                                
                    