Skip to content

Spark调节shuffle reduce端缓冲的大小防止OOM

刘军强 edited this page Aug 26, 2018 · 2 revisions

在spark的shuffle过程中,当map端产生数据的时候,并不是当整个map端全部执行完毕才将数据拉取到reduce端,而是map端产生一点数据就进行拉取到reduce端去执行聚合操作。每次reduce能拉取多少数据,是由缓冲区的大小来决定的,拉取的数据,首先存放在buffer中,然后用executor分配的堆内内存(占比20%)来处理,进行聚合操作。

默认的,reduce端的缓冲大小为48MB,当系统的资源不是很充足的时候,而此时map端的数据很大,而且执行速度非常快,这时reduce端的所有task,拉取的数据大小都达到了缓存的上限,这次再进行 聚合操作,可能要创建大量的对象,这时就会出现OOM。此时,我们可以减小缓存区的大小(比如减小为24M,12M等),可以增加拉取的数目,但是不至于OOM。

不过当系统的资源很充足的时候,我们也可以增加buffer的大小,减小网络传输性能的开销。

对于reduce端buffer的大小,可以通过参数spark.reducer.maxSizeInFlight来设置,默认48MB。