1)
-
spark中只有特定的算子會觸發shuffle,shuffle會在不同的分區間重新分配數據!
-
如果出現了shuffle,會造成需要跨機器和executor傳輸數據,這樣會導致 低效和額外的資源消耗!
2)
和Hadoop的shuffle不同的時,數據分到哪些區是確定的,但是在區內的順序不一定有序!
Hadoop 的shuffle :
MapTask : map------- sort -------- merge
ReduceTask: copy ---- sort ----- reduce
shuffle階段 : sort -------- merge ----- copy ---- sort
Spark的shuffle:
第一種表現: MapTask端也不排序,ReduceTask一定不排序!
第二種表現: MapTask端可以排序,ReduceTask一定不排序!
如果希望shuffle后的數據有序,可以以下操作:
a) 調用mapPartitions,對每個分區的數據,進行手動排序!
b)repartitionAndSortWithinPartitions
c)sortBy
3)
什么操作會導致shuffle
a)重新分區的算子 : reparition, collase
b) xxxBykey類型的算子,除了 count(統計)ByKey
c)join類型的算子,例如cogroup and join.
4)
在Spark中,shuffle會帶來性能消耗,主要涉及 磁盤IO,網絡IO,對象的序列化和反序列化!
總結:
①Spark的shuffle和Hadoop的shuffle目的都是為了 在不同的task交換數據!
② Spark的shuffle借鑒了hadoop的shuffle,但是在細節上略有不同
hadoop的shuffle: 在到達ReduceTask端時,會進行排序!
在Spark中,數據在ReduceTask端一定不排序,在MapTask端,可以根據設置進行排序或不排!
③shuffle會消耗性能,因此能避免就避免,避免不了,采取一些優化的策略!
