Spark 堆外内存
项目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.堆外内存使用超出预期的涉及点
用户代码
off heap: 资源释放不当, 例如加载文件资源次数过多, 且不正常关闭, 例如多次调用ClassLoader().getResourceAsStreamDriver端
DirectMemory: 拉取Executor端Task Result数据回Driver节点时, 此处消耗的DirectMemory内存 = conf.getInt(“spark.resultGetter.threads”, 4) * TaskResultSizeExecutor端
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即可.
- 其他框架:
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 堆外内存相关推荐
- spark从入门到精通spark内存管理详解- 堆内堆外内存管理
前言 Spark作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解Spark内存管理的基本原理,有助于更好地开发Spark应用程序和进行性能调优.本文将详细介绍两部 ...
- 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优...
一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体 1.代码调优 1.避免创建重复的RDD,尽 ...
- Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理)
Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理) 参考文章: (1)Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理) (2)https://ww ...
- Spark 内存管理堆内和堆外内存规划_大数据培训
堆内和堆外内存规划 作为一个 JVM 进程,Executor 的内存管理建立在 JVM 的内存管理之上,Spark 对 JVM 的堆内(On-heap)空间进行了更为详细的分配,以充分利用内存.同时, ...
- Spark 内存管理 spark.executor.memory /spark.memory.fraction/spark.memory.offHeap.size【堆外内存/内存管理】 钨丝计划
spark1.6及之后: 堆内内存: spark.executor.memory 包含 spark.memory.fraction: spark.memory.fraction 包含 spark.me ...
- java 堆外内存泄露排查
参考:http://blog.itpub.net/70016482/viewspace-2908649/ 一.原理 JDK提供绕过JVM直接在操作系统申请内存的接口,例如通过Unsafe类的alloc ...
- jvm 堆外内存_NIO效率高的原理之零拷贝与直接内存映射
更多内容,欢迎关注微信公众号:全菜工程师小辉~ 前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理. 这篇博客将针对第三个原因,进行更详细的讲 ...
- Java堆外内存的使用
堆外内存的回收见HeapByteBuffer和DirectByteBuffer以及回收DirectByteBuffer 基本类型长度 在Java中有很多的基本类型,比如: byte,一个字节是8位bi ...
- 一文探讨堆外内存的监控与回收
引子 记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存作为缓冲区,读写文件,逻辑可 ...
- Netty堆外内存泄露排查与总结
导读 Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程. Netty 底层基于 JDK ...
最新文章
- python培训机构推荐-广州有哪些不错的python培训班
- 杭电多校第三场-H-Game
- 对搜狗输入法的个人评价
- Rancher添加主机及对主机中的Docker容器进行图形化管理
- c++实现顺序表的相关操作
- Mongodb2.6升级到Mongodb3.0.2笔记
- 【渝粤教育】广东开放大学 个人与团队管理 形成性考核 (47)
- Leetcode46. Permutations全排列
- 错误:java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
- 【空间分析】2 空间数据符号化
- 拓端tecdat|使用R语言进行多项式回归、非线性回归模型曲线拟合
- U盘+WINPE 安装UEFI Ubuntu系统教程
- CSS入门到精通——表格样式
- 0x80070057(0x80070057解决方法win7)
- 分布式缓存 - memCached Voldemort
- P2002 消息扩散(图论 Tarjan缩点)
- HTML怎么给文本添加删除线?(代码教程)
- ArcGIS符号导入图片
- 用vue写一个天气webAPP
- Cmpp MsgId 生成算法
热门文章
- 解读对象存储九大关键特征
- 站点技术---301重定向
- LinkedIn庄振运:从国家部委公务员到硅谷系统性能专家,创新是唯一主旋律
- JavaCore HeapDump
- Android入门之login设计
- OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程(转)
- 新浪微博开放平台链接耗尽的情况分析
- Vmware View Client登陆后无法使用键盘输入
- 图解50道sql编写题
- this installer requires you to restart your system to finish installing Microsoft VC