项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.堆外内存有哪些

前面提到spark中的堆内存溢出,除了堆内存,还有堆外内存。该部分内存主要用于程序的共享库、Perm Space、 线程Stack和一些Memory mapping等, 或者类C方式allocate object.

堆外内存在Spark中可以从逻辑上分成两种: 一种是DirectMemory, 一种是JVM Overhead(下面统称为off heap), 这两者在Spark中的大小分别由两个参数设置.

Spark中有哪些地方会消耗堆外内存, 会在后面详细讲述.

如果堆外内存溢出,Spark UI表现如下:

Executor Off Heap超出被杀:

2.堆外内存使用超出预期的涉及点

  1. 用户代码
    off heap: 资源释放不当, 例如加载文件资源次数过多, 且不正常关闭, 例如多次调用ClassLoader().getResourceAsStream

  2. Driver端
    DirectMemory: 拉取Executor端Task Result数据回Driver节点时, 此处消耗的DirectMemory内存 = conf.getInt(“spark.resultGetter.threads”, 4) * TaskResultSize

  3. Executor端
    Executor可能消耗的情况如下:

(1)Direct Memory: RDD.cache()/RDD.persist()操作,
因为会涉及到拉取remote RDD Block时出现Direct OOM, 此时消耗的Direct Memory = 拉取的RDDBlockSize.

Tips: 查看RDD Block Size步骤: SparkUI->Storage Tabs -> 看众多RDD中Memory或者Disk中的totalSize/cached Partitions中最大的RDD, 点进去看详情页, 然后对RDD的大小 按照Memory或者Disk排序, 找到最大的RDD Block…

(2)Direct Memory, 拉取Shuffle数据时出现Direct OOM,
此时消耗的Direct Memory 通常= max(某个Shuffle Block的size, 50MB)

Tips: 可以在抛出该Direct OOM的Executor节点上检查是否有如下日志: Spark会在如果单个shuffleBlock的大小>1MB时输出该语句.

还有一种预估的方式, 前一阶段Stage 对其内的每个Task的Shuffle Write排序, 找到最大的Shuffle Write / 下一stage的task个数, 即为一个预估的shuffle Block大小.

(3)Direct Memory, RDD.persist(StorageLevel.DISK_ONLY)/RDD.persit(StorageLevel.MEMORY_AND_DISK)/RDD.persist(StorageLevel.MEMORY_AND_DISK_SER)等含有disk level的cache rdd操作.会带来额外Direct Memory消耗, 最多64MB * 3
(4)Off-Heap, RDD.persist(StorageLevel.DISK_ONLY)/RDD.persit(StorageLevel.MEMORY_AND_DISK)/RDD.persist(StorageLevel.MEMORY_AND_DISK_SER)等含有disk level的cache RDD操作.
一般情况最大的值是整个作业中最大的disk level的RDD Block的size. 但除了些许特殊操作: zip类操作(包括相同partitoner的RDD做union操作, 因为会被Spark后台优化成zip操作) 使用的size等于该操作zip的rdd中涉及的所有disk level rdd block size之和.

此部分Size如第(1)点所示, 找到Disk中最大的RDD Block即可.

  1. 其他框架:
    Off-Heap 涉及到读Hbase时会消耗比较多的off-heap内存, 但这部分已经通过参数(spark.hadoop.hbase.ipc.client.connection.maxidletime)控制使用上限制在256MB.

3.Spark堆外内存控制参数:

堆外内存的使用总量 = jvmOverhead(off heap) + directMemoryOverhead(direct memory) + otherMemoryOverhead

##4.解决思路
合理的参数推荐:
一般推荐总值:

spark.yarn.executor.directMemoryOverhead = { if 存在memory level or disk level 的 block then  第1点的Size else 0 } +{if Shuffle阶段抛出Direct OOM then 第2点的Size else 0} +{if 存在Disk level的Block then 第3点的192MB else 0} +{ if 存在其他框架的 then 其他框架的size else 0} + 256MBspark.yarn.executor.jvmOverhead = { if 存在disk level的Block then 第4点的Size  else 0 } + { if 存在其他框架的 then 其他框架的size else 0} +max(executor-memory * 0.1, 384)// 如果没有Executor表现为堆外内存使用超出, 则不需要手动调整.

Spark 堆外内存相关推荐

  1. spark从入门到精通spark内存管理详解- 堆内堆外内存管理

    前言 Spark作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解Spark内存管理的基本原理,有助于更好地开发Spark应用程序和进行性能调优.本文将详细介绍两部 ...

  2. 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优...

    一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体    1.代码调优 1.避免创建重复的RDD,尽 ...

  3. Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理)

    Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理) 参考文章: (1)Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理) (2)https://ww ...

  4. Spark 内存管理堆内和堆外内存规划_大数据培训

    堆内和堆外内存规划 作为一个 JVM 进程,Executor 的内存管理建立在 JVM 的内存管理之上,Spark 对 JVM 的堆内(On-heap)空间进行了更为详细的分配,以充分利用内存.同时, ...

  5. Spark 内存管理 spark.executor.memory /spark.memory.fraction/spark.memory.offHeap.size【堆外内存/内存管理】 钨丝计划

    spark1.6及之后: 堆内内存: spark.executor.memory 包含 spark.memory.fraction: spark.memory.fraction 包含 spark.me ...

  6. java 堆外内存泄露排查

    参考:http://blog.itpub.net/70016482/viewspace-2908649/ 一.原理 JDK提供绕过JVM直接在操作系统申请内存的接口,例如通过Unsafe类的alloc ...

  7. jvm 堆外内存_NIO效率高的原理之零拷贝与直接内存映射

    更多内容,欢迎关注微信公众号:全菜工程师小辉~ 前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理. 这篇博客将针对第三个原因,进行更详细的讲 ...

  8. Java堆外内存的使用

    堆外内存的回收见HeapByteBuffer和DirectByteBuffer以及回收DirectByteBuffer 基本类型长度 在Java中有很多的基本类型,比如: byte,一个字节是8位bi ...

  9. 一文探讨堆外内存的监控与回收

    引子 记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存作为缓冲区,读写文件,逻辑可 ...

  10. Netty堆外内存泄露排查与总结

    导读 Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程. Netty 底层基于 JDK ...

最新文章

  1. python培训机构推荐-广州有哪些不错的python培训班
  2. 杭电多校第三场-H-Game
  3. 对搜狗输入法的个人评价
  4. Rancher添加主机及对主机中的Docker容器进行图形化管理
  5. c++实现顺序表的相关操作
  6. Mongodb2.6升级到Mongodb3.0.2笔记
  7. 【渝粤教育】广东开放大学 个人与团队管理 形成性考核 (47)
  8. Leetcode46. Permutations全排列
  9. 错误:java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
  10. 【空间分析】2 空间数据符号化
  11. 拓端tecdat|使用R语言进行多项式回归、非线性回归模型曲线拟合
  12. U盘+WINPE 安装UEFI Ubuntu系统教程
  13. CSS入门到精通——表格样式
  14. 0x80070057(0x80070057解决方法win7)
  15. 分布式缓存 - memCached Voldemort
  16. P2002 消息扩散(图论 Tarjan缩点)
  17. HTML怎么给文本添加删除线?(代码教程)
  18. ArcGIS符号导入图片
  19. 用vue写一个天气webAPP
  20. Cmpp MsgId 生成算法

热门文章

  1. 解读对象存储九大关键特征
  2. 站点技术---301重定向
  3. LinkedIn庄振运:从国家部委公务员到硅谷系统性能专家,创新是唯一主旋律
  4. JavaCore HeapDump
  5. Android入门之login设计
  6. OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程(转)
  7. 新浪微博开放平台链接耗尽的情况分析
  8. Vmware View Client登陆后无法使用键盘输入
  9. 图解50道sql编写题
  10. this installer requires you to restart your system to finish installing Microsoft VC