Spark性能调优 troubleshooting shuffle调优 reduce端缓冲大小以避免OOM

reduce导致 内存溢出原因

reduce端拉取map端task,是map端写一点数据,reduce端taskk就会拉取一小部分数据,立即进行后面的聚合、算子函数应用
每次拉取数据量大小是有buffer决定的,而默认大小是48M,有时候,map端的数据量很大的情况下,reduce端所有task拉取数据全部达到缓冲最大极限值,然后加上reduce端执行聚合函数代码会创建大量对象。这时候可能会出现内存不够,也就是OOM,reduce端内存溢出

解决方案

以降低性能换取执行
减少reduce端task缓冲的大小。我宁愿多拉取几次,但是每次同时能够拉取到reduce端每个task的数量,比较少,就不容易发生OOM内存溢出的问题。(比如,可以调节成12M)

这种时候,只能采取牺牲性能的方式了,spark作业,首先,第一要义,就是一定要让它可以跑起来。分享一个经验,曾经写过一个特别复杂的spark作业,写完代码以后,半个月之内,就是跑不起来,里面各种各样的问题,需要进行troubleshooting。调节了十几个参数,其中就包括这个reduce端缓冲的大小。总算作业可以跑起来了。

如果内存充足,可以调大参数,提高性能

如果map端数据量不是特别大,然后application 资源很充足情况下,可以适当调大reduce端缓冲大小,这样reduce task每次拉取数据量就很会变大,拉取次数降低,这样就会减少网络开销,reduce端聚合操作执行也会减少,性能应该会提高。但是前提是,内存充足

http://spark.apache.org/docs/2.0.0/configuration.html
在这里插入图片描述

参考 shuffle寻址

https://mp.csdn.net/mdeditor#

猜你喜欢

转载自blog.csdn.net/chixushuchu/article/details/85099802