spark shuffle操作的两个特点:
1.spark中bucket缓存默认是100KB,写入数据达到刷新到磁盘的阈值后,就会将数据一点一点刷新到磁盘。如果内存缓存过小,会发生过多的磁盘IO操作,需要根据实际的业务情况进行优化。
2.MapReduce必须将所有的数据都写入本地磁盘文件后,才能启动reduce操作,来拉取数据,因为MapReduce要实现默认的根据key的排序,需要写完所有的数据才能排序,然后reduce来拉取。spark默认情况下不会对数据进行排序,ShuffleMapTask每写入一点数据,ResultTask就可以拉取一点数据,然后在本地执行自定义的聚合函数和算子,进行计算。
spark这种机制好处是速度比MapReduce快很多。MapReduce提供的reduce可以处理每个Key对应的value,很方便。但是spark由于实时拉取的机制,不能直接处理key对应的values算子,只能通过groupByKey,先shuffle得到一个MapPartitionRDD,然后用map算子来处理每个key对应的values,比较繁琐。