Mapreduce中Shuffle 与 Spark中Shuffle 的区别 ?
Spark 1.2以后默认用SortShuffleManager
不同点:
Mapreduce Shuffle | Spark Shuffle | |
map端大文件的索引文件 | 没有 | 有 |
map端输出的文件是否有序 | 有序 | 如果启用byPass机制则不会排序,反之会排序 |
reduce端读取文件 | 直接读取map输出的大文件 | 先读取索引文件 |
启用byPass机制的触发条件:
- shuffle read task数量小于spark.shuffle.sort.bypassMergeThreshold参数的值(默认是200)
- 不是聚合类的shuffle算子(比如repartition、join;reduceByKey是聚合类算子)
相同点:
1 都是先写到内存,达到阈值时溢出多个小文件
2 有多少个map会产生多少个大文件;上游stage有多个少task,也会产生多少个大文件;
网上经常说的spark基于内存计算,意思是可以把反复用到的数据cache到内存中,不再反复从磁盘加载到内存,所以快。spark的shuffle,中间文件也是会落磁盘的!
mr不会把多次用到的同一份数据cache到内存中,是多次从磁盘加载到内存。
还没有评论,来说两句吧...