Spark调优:调节Executor的堆外内存

1 调节Executor的堆外内存

堆外内存是jvm进程中除了java堆内存占用的空间大小,包括方法区,java虚拟机   本地方法张 jvm进程本身所用的内存,直接内存等。通过spark.yarn.executor。memoryoverhead设置。单位为MB  

Spark底层的shuffle的传输方式是使用netty 的oio传输的,netty在进行网络传输的过程中会申请堆外内存,netty是0拷贝,所以使用了堆外内存。

默认情况下,对外内存是一个executor的内存大小的10%,真正处理大数据时,这里 出现了问题,导致spark作业反复奔溃,无法运行,此时就会调节这个参数,至少1G,

 

execuor在进行shuffle write的时候,优先从自己本地关联的mapoutPUtworker中获取某份数据,如果本地blockmanager没有的话,那么会通过transferSERVICE,

去远程连接其他节点上executor的block manager去获取,尝试建立远程的网络连接,并且去拉取数据。频繁创建对象让JVM堆内存满溢,进行垃圾回收。正好碰到那个exeuctor的JVM在垃圾回收。处于垃圾回过程中,所有的工作线程全部停止;相当于只要一旦进行垃圾回收,spark / executor停止工作,无法提供响应,spark默认的网络连接的超时时长是60s;如果卡住60s都无法建立连接的话,那么这个task就失败了。task失败了就会出现shuffle file cannot find的错误。

那么如何调节等待的时长呢?

在./spark-submit提交任务的脚本里面添加:

--conf spark.core.connection.ack.wait.timeout=300

Executor由于内存不足或者堆外内存不足了,挂掉了,对应的Executor上面的block manager也挂掉了,找不到对应的shuffle map output文件,Reducer端拉不到数据,我们可以调节堆外内存,如果调节?

./spark-submit 提交任务的脚本里面添加

yarn下

--conf spark.yarn.executor.memroyOverhead=....

standalone下

--conf  spark.executor.memoryOverhead=2048单位M

 

posted @ 2018-12-27 16:06  大大的海棠湾  阅读(2413)  评论(0)    收藏  举报