一: 爲何須要Sort-Based Shuffle? 1.Shuffle通常包含兩個階段:第一部分,產生Shuffle的階段(也叫Map階段),第二階段,使用Shuffle數據的階段(也叫Reduce階段) 2.Spark的Job會被劃分紅不少Stage,若是隻有一個Stage則這個Job就只有一個Mapper,固然不會產生Shuffle,適合ETL。 若是不止一個Stage,最後一個Stage就是最終的Reduce,最左側的Stage就僅僅是整個Job的Mapper,中間全部的任意一個 Stage是其父Stage的Reducer,其子Stage的Mapper 3.Spark Shuffle在最開始的時候只支持Hash-base Shuffle:默認Mapper階段會爲Reducer階段的每個Task單首創建一個 文件來保存該Task中要使用的數據,可是在一些狀況下(例如數據量很是大的狀況)會形成數據文件(M*R M:Mapper端的並 行任務數,R:Reducer端的並行任務數)的隨機磁盤I/O操做,且會造成大量的Memory消耗(極易形成OOM),後來改善方式 是加入了Shuffle Consolidate機制來將Shuffle時候產生文件的數量減小到C*R個(C:Mapper端同時可以使用Cores的數 量,R:Reducer端的並行任務數)。若是此時Reducer端的並行任務數過多,依舊沒有逃脫文件過多的命運