Spark 从 0 到 1 学习(10) —— Spark 调优(四)——Executor 的堆外内存调优

1. 调节 Executor 的堆外内存

Spark 底层 shuffle 的传输方式使用的是 netty 传输,netty 在进行网络传输的过程会申请堆外内存(netty 是零拷贝),所以使用了堆外内存。默认情况下,这个堆外内存上限是每个 Executor 的内存大小的 10%。真正处理大数据的时候,这里都会出现问题,导致 Spark 作业反复崩溃,无法运行。此时就需要去调节这个参数。调到至少 1G,甚至是2G、4G。

Executor 在进行 shuffle write,优先从自己本地关联的 MapOutPutWorker 中获取某份数据,如果本地 Block Manager 没有的话,name会通过 TransferService 去远程连接其他节点上 Executor 的 Block Manager 去获取数据,尝试建立远程的网络连接,并拉取数据。频繁创建对象让 JVM 堆内存溢满,进行垃圾回收。正好碰到那个 Executor 的 JVM 在垃圾回收,Executor 会停止工作,无法提供响应。Spark 默认网络连接的超时时长为 60s。如果 60s 都无法建立连接的话,那么这个 task 就失败了。task 失败就会出现 shuffle file cannot find 的错误。

1.1 如何调节等待时长呢?

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

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

1.2 如何调节堆外内存?

​ Executor 由于内存不足或者堆外内存不足,挂掉了。对应的 Executor上的 Block Manager 也挂掉了,找不到对应的 shuffle map output 文件。Reducer 端不能够拉取数据。我们可以调节堆外内存的大小,如何调节?

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

  • yarn 下:

    --conf  spark.yarn.executor.memoryOverhead=2048
    
  • standalone 下:

    --conf  spark.executor.memoryOverhead=2048
    

猜你喜欢

转载自blog.csdn.net/dwjf321/article/details/109056333
今日推荐