Spark-Shuffle過程概要參考
在MapReduce框架中,shuffle是連線Map和Reduce之間的橋樑,Map的輸出要用到Reduce中必須經過shuffle這個環節,shuffle的效能高低直接影響了整個程式的效能和吞吐量。Spark作為MapReduce框架的一種實現,自然也實現了shuffle的邏輯。
Spark-Shuflle發展階段
Spark-Shuflle1: HashShuflle階段,生成MM*RR箇中間小檔案,MM為Map數量,RR為Reduce數量;
Spark-Shuffle2: 優化的HashShuflle,cosolidate機制,生成CC * RR箇中間小檔案,CC為core數量;
Spark-Shuffle3: SortShuffle階段,生成MM*2箇中間小檔案#(資料檔案 + 索引檔案)。
什麼是Shuffle?
Shuffle是MapReduce框架中的一個特定的phase,介於Map phase和Reduce phase之間,當Map的輸出結果要被Reduce使用時,輸出結果需要按key雜湊,並且分發到每一個Reducer上去,這個過程就是shuffle。由於shuffle涉及到了磁碟的讀寫和網路的傳輸,因此shuffle效能的高低直接影響到了整個程式的執行效率。
下面這幅圖清晰地描述了MapReduce演算法的整個流程,其中shuffle phase是介於Map phase和Reduce phase之間。
概念上shuffle就是一個溝通資料連線的橋樑,那麼實際上shuffle(partition)這一部分是如何實現的的呢,下面我們就以Spark為例講一下shuffle在Spark中的實現。
Spark Shuffle進化史
先以圖為例簡單描述一下Spark中shuffle的整一個流程:
首先每一個Mapper會根據Reducer的數量建立出相應的bucket,bucket的數量是MM×RR,其中MM是Map的個數,RR是Reduce的個數。
其次Mapper產生的結果會根據設定的partition演算法填充到每個bucket中去。這裡的partition演算法是可以自定義的,當然預設的演算法是根據key雜湊到不同的bucket中去。
當Reducer啟動時,它會根據自己task的id和所依賴的Mapper的id從遠端或是本地的block manager中取得相應的bucket作為Reducer的輸入進行處理。
#補充說明:這裡的bucket是一個抽象概念,在實現中每個bucket可以對應一個檔案,可以對應檔案的一部分或是其他等。
Apache Spark 的 Shuffle 過程與 Apache Hadoop中MR 的 Shuffle 過程有著諸多類似,一些概念可直接套用,例如,Shuffle 過程中,提供資料的一端,被稱作 Map 端,Map 端每個生成資料的任務稱為 Mapper,對應的接收資料的一端,被稱作 Reduce 端,Reduce 端每個拉取資料的任務稱為 Reducer,Shuffle 過程本質上都是將 Map 端獲得的資料使用分割槽器進行劃分,並將資料傳送給對應的 Reducer 的過程。
#
相關文章
- Android群英傳實踐過程參考文章薈萃Android
- 科目三考試過程
- 2019軟考備戰:軟考中級課程+參考資料
- TIDB 考試 參考TiDB
- OSI參考模型和TCP/IP參考模型模型TCP
- javamail參考JavaAI
- WebApiClient效能參考WebAPIclient
- OSI參考模型模型
- 模擬考試參考程式碼
- 04.Eclipse下Ndk開發(以檔案拆分合併為例模擬一下開發過程,參考檔案加密的過程)Eclipse加密
- vue2.x原始碼解析系列二: Vue元件初始化過程概要Vue原始碼元件
- Blender參考API用法API
- LVS - ipvsadm命令參考
- Oracle ASMCMD命令參考OracleASM
- SQL優化參考SQL優化
- openGauss ODBC介面參考
- Latex—參考文獻
- CloudBeaver 參考架構Cloud架構
- 參考文獻合集
- echarts markLine參考線Echarts
- PyQtGraph繪圖參考QT繪圖
- oracle 參考資料Oracle
- spring-boot參考文章Springboot
- Spring Boot 參考指南(Hazelcast)Spring BootAST
- HTML標籤參考(一)HTML
- Elasticsearch 參考指南(介紹)Elasticsearch
- http http headers參考文件HTTPHeader
- Oracle官方參考資料Oracle
- 前端知識點參考前端
- JavaScript物件參考手冊JavaScript物件
- HTML 字元實體參考HTML字元
- openGauss 配置檔案參考
- docker 配置引數參考Docker
- multipath配置詳細參考
- mysql許可權參考MySql
- JavaScript Math(數學) 參考JavaScript
- em字型大小參考物件物件
- docker 安裝 MySQL (參考)DockerMySql