有时候,如果你的spark作业处理的数据量特别特别大,几亿数据量;然后spark作业一运行,时不时报错,比如shuffle file cannot find,executor、task lost,out of memory;
可能是说executor的堆外内存不太够用,导致executor在运行的过程中,可能会内存溢出;然后可能导致后续的stage的task在运行的时候,要从一些executor中去拉取shuffle map output文件,但是executor可能已经挂掉了,关联的block manager也没有了;所以可能会报shuffle output file not found;resubmitting task;executor lost;spark作业彻底崩溃。
上述情况下,就可以去考虑调节一下executor的堆外内存。此外,有时堆外内存调节的比较大的时候,对于性能来说,也会带来一定的提升。
我们可以在spark submit中用--conf的方式去添加配置。譬如--conf spark.yarn.executor.memoryOverhead=2048,这个参数指的是yarn提交模式中executor的堆外内存上限。默认情况下,这个堆外内存上限大概是300多m;后来我们通常项目中,真正处理大数据的时候,这里都会出现问题;此时调节这个参数到2G、4G,就能解决问题。
还有一种可能是task创建的对象特别大,特别多,导致频繁的让jvm堆内存满溢,进行垃圾回收。此时就会没有响应,无法建立网络连接;spark默认的网络连接超时时长是60s;如果卡住60s都无法建立连接的话,那么就宣告失败了。重试几次都拿不到数据或者最后终于拿到数据,但是大大延长了spark作业的运行时间。那么就可以考虑调节连接的超时时长。即--conf spark.core.connection.ack.wait.timeout=300,也是在submit时设置。