使用的Spark2以上版本所以只考虑UnifiedMemoryManager动态内存管理,如图:

1. 内存划分 与 内存计算 与 调参方式

1.1 三部分:Spark内存、用户内存、预留内存

  1. 预留内存:300MB 固定
  2. Spark内存和用户内存比例由参数spark.memory.fraction(默认0.75) 控制
  3. 计算公式:
    假设:我们在submit提交参数设置 executor.memeory = 10G + 300M (方便计算),我们叫他为系统内存
    那么:
    Spark内存 = (系统内存 - 预留内存) fraction = (10G + 300M - 300M) * 0.75 = 7.5G*
    用户内存 = (系统内存 - 预留内存) (1 - fraction) = 10 G * (1 - 0.75) = 2.5G*

1.2 Spark内存又分为两部分:存储内存、执行内存

  1. 存储内存、执行内存比例有spark.memory.storageFraction(默认0.5) 控制
  2. 计算公式:
    假设:1.1的计算成立
    那么:
    存储内存 = Spark内存*storageFraction = 7.5G * 0.5 = 3.75G
    执行内存 = Spark内存*storageFraction = 7.5G * (1 - 0.5) = 3.75G

2. 内存参数调优

可以看出来实际设置了10G,而执行内存却只有了3.5G,所以需要根据业务来进行参数调整。

2.1 调大spark.memory.storageFraction=0.6

如果程序中有需要使用内存Cache的而不需要太多计算shuffer之类的那么可以增加存储内存,调大spark.memory.storageFraction参数

2.2 调小spark.memory.storageFraction=0.3

  1. 如果程序没有cache而又大量shuffer就需要执行内存大一些,调小spark.memory.storageFraction参数
  2. 如果我们程序运行比较慢了,可以使用Jstat -gc pid来查看GC情况,当发现GC频繁,就说明执行内存不够,需要调小spark.memory.storageFraction参数

3. 再说一点:JVM参数调整

  1. Jstat -gc pid发现Minor GC频繁,但是Full GC几乎没有,那么就需要调整JVM参数来调大Eden伊甸园区,使用-Xmn来调整
  2. 大小设置:
    说一个案例:
    假设:
    1.Spark读取的是HDFS上的文件,HDFS上默认的Block块大小为128M
    每个executor有8个core,executor-cores来设置
  3. 估算Eden区大小应为128M * 8 大约1G,考虑survivor区-Xmn = 4/3 * 1 G 大约1.4GB
  4. 2中是没有压缩的数据,假设数据进行压缩了,还要考虑压缩方式是否可以切片,例如使用Snappy压缩不能切片,每个文件700MB,那么Eden区的设置要把解压后数据膨胀考虑进去,假设膨胀3倍
    估算Eden = 700M* 3 * 8 大约 16G
    -Xmn = 4/3 * 16G 大约 21.5GB,才能保证程序可以正常执行,要不然很容易出现OOM,当前还可以设置堆外内存来缓解压力--conf spark.memory.offHeap.size=5g
  5. 更换压缩方式,尽量使用能够切片的压缩方式,如果不能只能增加存储的文件数来减小每个task读取数据的大小,或者减少Executor core来增大每个core的内存,但是Spark的并行度会降低,执行时间变长,需要自己权衡利弊。
  6. 注意:使用G1垃圾回收器时,不要使用 -Xmn 选项或 -XX:NewRatio 等其他相关选项显式设置年轻代大小。固定年轻代的大小会覆盖暂停时间目标。可以仅使用-Xms,-Xmx和暂停时间目标-XX:MaxGCPauseMillis ,经过测试如果设置-Xmn会经常出现Full GC,去掉后Full GC为0次,而且总的GC时间大大减少,spark程序卡顿减少。

3.1 -Xmn

-Xmn这里需要多说一下,经过线上执行情况分析,一开始使用的-Xmn=18G,Spark程序执行时间2.2小时,并伴有几十次Full GC;去掉-Xmn后,Spark程序执行时间58分钟,0次Full GC。第二次测试时我将每个executor_core设置为了5,第一次为8,并没有控制变量,因为目地是优化不是测试。

4.对象的使用

为了减少有些数据结构与对象的元数据占用大量空间,尽量使用:
字符串代替对象,基本数据类型(int long)代替字符串,数组代替ArrayList等
String内部是一个char数据,char采用UTF-16编码,每个字符两字节,可以设置JVM参数 -XX:+UseCompressedStrings采用8位来编码每一个ASCII字符来压缩字符。

下面是我的参数,需要根据自己的程序去修改一些参数值:

# submit参数
spark-submit --master spark://192.168.11.167:7077   \
--class $main --deploy-mode client --driver-memory 25g  \
--executor-memory 45g   \
--executor-cores 8  \
--total-executor-cores 320  \
--conf spark.memory.fraction=0.8   \
--conf spark.memory.storageFraction=0.3    \
--conf spark.memory.offHeap.enabled=true   \
--conf spark.memory.offHeap.size=5g    \
--conf spark.executor.memoryOverhead=5G    \
--conf spark.speculation=true  \
--conf spark.network.timeout=3000  \
--conf spark.executor.extraJavaOptions="-XX:+UseG1GC -XX:-TieredCompilation -XX:G1HeapRegionSize=16m -XX:InitiatingHeapOccupancyPercent=55 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-UseCompressedClassPointers -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:ReservedCodeCacheSize=512m -XX:+UseCodeCacheFlushing -XX:ParallelGCThreads=20 -XX:ConcGCThreads=20 -Xms20g -XX:+PrintGCDetails -XX:+PrintGCTimeStamps" \
--conf spark.driver.extraJavaOptions="-XX:+UseG1GC" \
--jars $jars xxxx.jar $date1 $max $date2  >> log/$log_file#代码内参数
conf.set("spark.driver.maxResultSize", "8g");
conf.set("spark.serialize", "org.apache.spark.serializer.KryoSerializer");
conf.registerKryoClasses(new Class[]{ImmutableBytesWritable.class, HyperLogLog.class, HashSet.class, RegisterSet.class, IllegalArgumentException.class, FileCommitProtocol.TaskCommitMessage.class});
//conf.set("spark.kryo.registrationRequired","true"); #开启的话类没加到上面会报错
conf.set("spark.kryoserializer.buffer.mb", "10");
conf.set("spark.shuffle.file.buffer", "128");
conf.set("spark.reducer.maxSizeInFlight", "144");
conf.set("spark.shuffle.io.maxRetries", "50");
conf.set("spark.shuffle.io.retryWait", "5s");

Spark2内存调优总结 - 内存划分 与 内存计算 与 调参方式相关推荐

  1. 发布即巅峰:Java性能调优六大工具:MAT内存分析工具

    MAT内存分析工具 MAT是MemoryAnalyzerTool的简称,它是一款功能强大的Java堆内存分析器,可以用于查找内存泄漏以及查看内存消耗情况.MAT是 基于Eclipse开发的一款免费的性 ...

  2. 直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解

    JVM系列 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势.及使用场景 直通BAT必考题系列:JVM的4种垃圾回收算法.垃圾回收机制与总结 直通BAT必考题系列:深入详解JVM内存模型与JVM ...

  3. 如何开启jvm日志_直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解...

    JVM系列 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势.及使用场景 直通BAT必考题系列:JVM的4种垃圾回收算法.垃圾回收机制与总结 直通BAT必考题系列:深入详解JVM内存模型与JVM ...

  4. 深入理解JVM虚拟机14:JVM性能调优的6大步骤,及关键调优参数详解

    JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...

  5. 调优为王!阿里巴巴彩版java性能调优实战,终于到手了!

    怎样才能做好性能调优? 开始之前,我先来讲一下我对性能调优的看法.在我看来Java的性能调优并不是像学习编程语言一样可以通过学习掌握,它是没有办法用直线的思维学会并掌握使用的,并且它对于程序员来说,对 ...

  6. JVM调优笔记:认识JVM内存模型(jdk1.8)

    文章目录 1.什么是JVM 2.jdk.jre.jvm关系 3.JVM执行过程 4.JVM执行程序的过程 5.JVM运行时数据区 虚拟机栈(线程私有) 本地方法栈(线程私有) 程序计数器(线程私有) ...

  7. JVM调优:运行参数,内存模型,mat、jps、jstat、jmap、jstack、jvisualvm工具的使用

    JVM调优 - 工具篇 作者:张学亮 讲解内容 了解下我们为什么要学习JVM优化 掌握jvm的运行参数以及参数的设置 掌握jvm的内存模型(堆内存) 掌握jamp命令的使用以及通过MAT工具进行分析 ...

  8. JVM性能调优2_垃圾收集器与内存分配策略__享学课堂

    判断对象的存活 引用计数法: 优点:快,方便,实现简单: 缺点:对象相互引用时,很难判断对象是否该回收. 可达性分析: 这个算法的基本思路就是通过一系列的称为"GC Roots"的 ...

  9. gateway 内存溢出问题_带你学习jvm java虚拟机 arthas/性能调优/故障排除/gc回收/内存溢出等...

    学完本课程,您将掌握: 内存溢出问题实战 CPU飙升问题实战 阿里巴巴Arthas在线诊断 Class字节详细拆解 手写类加载器.四种类加载器.双亲委托模型 对象创建.存储.访问.加载解析 性能调优. ...

  10. Linux 调优篇:虚拟化调优(hugepage 大页内存)* 叁

    一. 大页(HugePages)概念     Hugepage的引入 二. hugepages相关概念 三.Regular Pages 与 HugePages     a.Regular Pages ...

最新文章

  1. 300 Longest Increasing Subsequence
  2. 深度学习笔记七:循环神经网络RNN(基本理论)
  3. 关于.h .lib .dll的总结
  4. ansible命令应用示例
  5. JavaScript中关于setTimeout和setInterval的使用
  6. Pytorch---训练与测试时爆显存(out of memory)的一个解决方案(torch.cuda.empty_cache())
  7. 太疯狂了!刚刚,马斯克脑机接口试验成功!这次是活猪下次是人脑!
  8. 剑指_6从尾到头打印链表(Python)
  9. dos2unix离线安装
  10. 如何利用网管软件管控SNMP协议的网络设备
  11. 百度离线地图API v3.0开发解决方案
  12. 【番杰的小技巧笔记】查看windows许可证到期时间
  13. 金融快借贷款app下载域名微信内显示已停止访问该网页---被微信封杀或屏蔽的原因及预防措施
  14. 特殊矩阵——对称矩阵(Symmetric Matrix)
  15. 【Flume】Flume原理简述及示例实践
  16. android 酷炫倒计时,Hurry - 一个有颜值又好用的倒计时应用 - Android 应用 - 【最美应用】...
  17. 【读书笔记】科技写作与交流 - 1.科技写作原则:文体及其构成
  18. 数据查询和业务流分开_索格非SOGEFI:EDI 业务场景详解之生成DESADV
  19. [AS/400] 基本概念
  20. 梦里又见清明雨!你最思念的人是谁?

热门文章

  1. 推荐几个配色和图标网站
  2. Android 使用SeekBar调节系统音量
  3. 第八章方差分析以及线性回归(2)
  4. 2017蓝桥杯决赛-发现环 数据结构|搜索
  5. binlog日志_【删库跑路】使用Binlog日志恢复误删的MySQL数据
  6. PHP统计API调用,php – 记录API调用
  7. 开机自启动脚本_使用xtu降低笔记本(游戏本)cpu电压及功耗·游戏本延时(以及试着解决开机自启动的问题)...
  8. linux awr 日志,Linux平台生成awr报告
  9. tx2无法识别网络_Jetson TX2开篇--网络配置
  10. 数据库查找姓李的人_最通俗易懂的理解什么是数据库