5.3、shuffle调优
spark在执行groupByKey、reduceByKey等操作时的,shuffle环节的调优。这个很重要。shuffle调优,其实对spark作业的性能的影响,是相当之高!!!经验:在spark作业的运行过程中,只要一牵扯到有shuffle的操作,基本上shuffle操作的性能消耗,要占到整个spark作业的50%~90%。10%用来运行map等操作,90%耗费在两个shuffle操作。groupByKey、countByKey。 参考文档: https://www.jianshu.com/p/98a1d67bc226 https://blog.csdn.net/zhanglh046/article/details/78360762
- 5.3.1、shuffle原理
- 5.3.2、合并map端输出文件
- 5.3.3、调节map端内存缓冲与reduce端内存占比
- 5.3.4、控制shuffle reduce端缓冲大小以避免OOM
map端的task是不断的输出数据的,数据量可能是很大的。
但是,其实reduce端的task,并不是等到map端task将属于自己的那份数据全部写入磁盘文件之后,再去拉取的。map端写一点数据,reduce端task就会拉取一小部分数据,立即进行后面的聚合、算子函数的应用。
每次reduece能够拉取多少数据,就由buffer来决定。因为拉取过来的数据,都是先放在buffer中的。然后才用后面的executor分配的堆内存占比(0.2),hashmap,去进行后续的聚合、函数的执行。 注意与reduce端内存占比的区别设置spark.reducer.maxSizeInFlight
- 5.3.5、HashShuffleManager与SortShuffleManager