shuffle階段劃分
Map階段和Reduce階段
任務
MapTask和ReduceTask
shuffle過程
Map階段shuffle:分區->排序->合並
①數據從環形緩沖區溢寫到磁盤前,需要先進行分區,然後區內排序
②環形緩存區數據到達閾值(80%),會以小文件的形式溢寫到磁盤,此過程可以開啟combiner
③將溢寫的小文件按照相同分區進行merge
Reduce階段shuffle:拷貝數據->排序->合並
①壹個ReduceTask負責壹個分區數據,需從多個MapTask的同壹個分區拷貝數據到機器。
②將拷貝過來的數據優先存儲在內存,次之磁盤,然後排序,合並做到數據分區內有序
shffle的意義 :只有存在reduce才有shuffle,shuffle的意義就是給reduce提供服務。
介紹
①spark的某些算子會觸發shuffle,出現shuffle的目的是在不同分區間重新分配數據。
②shuffle過程數據是跨機器傳輸的,消耗大量的網絡io和序列化,消耗性能。
③shuffle後不能保證新的分區的數據是有序的。區別於MR ( MR的shuffle後區內的數據是有序的 )
但是可以調用排序的算子,使得數據區內有序。
④產生shuffle的算子都是分兩步執行,mapTask組織數據(shuffle write), reduceTask(shuffle read)
⑤spark的mapTask優先將數據寫入內存,內存不足,將數據區內有序,溢寫到磁盤
會產生shuffle的算子
①repartition 和 coalesce 重新計算分區的算子。
②?ByKey:除了countByKey,都會產線shuffle
③cogroup 和 join
性能的影響
shuffle就是將數據在不同分區間進行聚合分配,集群的多節點的數據交換,會涉及到磁盤I/O,序列化,網絡I/O,很消耗性能。
spark中的shuffle耗時,消耗性能,應該盡量避免!
spark中的shuffle和MapReduce的shuffle的功能壹致,跨機器傳輸數據,細節略有不同。