map端内存缓冲: spark.shuffle.file.buffer (map端内存缓冲,默认32kb)
reduce端内存占比: spark.shuffle.memoryFraction (reduce端内存占比,默认0.2,20%)
理论基础和问题背景:
首先需要声明的是,这两个参数会被认为是调节shuffle的不二选择,但事实是调节这两个参数会对shuffle调优有效果,但并不是决定性的。而往往,shuffle的性能也不是这两个参数单方面就能决定的。
默认情况下,shuffle的map task输出到磁盘文件时,都会统一先写入自己的内存缓冲区,这个缓冲区的默认大小是32k。当每次内存缓冲区满溢后,才会执行spill(溢写)操作,溢写到磁盘。(如上图)
shuffle的reduce task拉取到数据后,用hashmap的数据格式,先汇聚每个key对应的values,再针对每个key的values进行我们自定义的聚合操作。
reduce task在进行聚合操作时,使用的就是reduce task自己对应的executor内存,executor(就是jvm进程)堆内存。 默认executor划分给reduce task聚合的内存比例是0.2。