一.JVM调优
JVM:
老年代:
存放少量生命周期长的对象,如连接池
年轻代:
Spark task执行算子函数自己创建的大量对象
JVM机制:
对象进入java虚拟机之后会放在eden区域和一个survivor区域,还有一个空闲的survivor区域的是空闲的.Eden区域和一个survivor区域满了之后会触发minor GC(小型垃圾回收)清除不再使用的对象,给后续对象腾地方.
活下来没有被清除的对象,会首先放之前空闲的survivor,但是默认eden、survior1和survivor2的内存占比是8:1:1,如果活下来的对象大于1,一个survivor区域放不下,此时会通过JVM的担保机制,将多余1的对象放入老年代
如果JVM内存不够大,可能会造成频繁年轻代内存溢出,频繁的minor GC会导致短时间内,有些存活的对象,多次垃圾回收都没有回收掉,会导致这种短声明周期(不一定是长期使用的)对象,年龄过大,垃圾回收次数太多还没有回收就跑到老年代.
老年代中,经过上面的不断沉凹,可能会造成内不足,囤积一大堆短声明周期的,本应该在年轻代中的,可能马上就要被回收掉的对象,此时,可能导致老年代频繁的满溢,造成频繁进行Full GC(全局/全面垃圾回收).full GC 是针对数量较少的老年代中对象.Full GC的频率应该很少,因此采取了不复杂,但是很严谨的算法,很耗费性能和时间的垃圾回收算法.FullGC很慢.
内存不充足的时候,出现的问题:
1、频繁minor gc,也会导致频繁spark停止工作
2、老年代囤积大量活跃对象(短生命周期的对象),导致频繁full gc,full gc时间很长,短则数十秒,长则数分钟,甚至数小时。可能导致spark长时间停止工作。
3、严重影响咱们的spark的性能和运行的速度。
JVM调优:
1.降低cache(全部缓存到内存)操作的内存占比
Spark中,堆内存分为两块:
一块用于RDD的cache,persist操作进行RDD的数据缓存
一块用于spark算子函数的运行使用
如果cache不那么紧张,但task算子函数创建的对象过多,内存又不够大,就会导致频繁的minor GC 甚至频繁的Full GC,导致spark频繁的停止工作,严重影响性能.
方案:
通过任务运行界面,查看spark作业的运行统计,可以看到stage的运行情况,包括美国task的运行时间,gc时间等,观察GC很频繁就可以适当调节堆内存块比列.
降低cache操作的内存占比,大不了用persist操作,选择将一部分缓存的RDD数据写入磁盘,或者序列化方式,配合Kryo序列化类,减少RDD缓存的内存占用。降低cache操作内存占比,对应的,算子函数的内存占比就提升了。这个时候,可能就可以减少minor gc的频率,同时减少full gc的频率。对性能的提升是有一定的帮助的。
一句话,让task执行算子函数时,有更多的内存可以使用。
spark.storage.memoryFraction,0.6 -> 0.5 -> 0.4 -> 0.2
2.调节executor堆外内存与连接等待时长
1.executor堆外内存:
shuffle file cannot find,executor、task lost,out of memory(内存溢出)
shuffle output file not found,resubmitting task,executor lost(executor挂了,blockmanager也没有了)
针对上述两种错误就可以考虑调节一下executor的堆外内存。也许就可以避免报错。此外,有时堆外内存调节的比较大的时候,对于性能来说,也会带来一定的提升。
可以调节堆外内存的上限:
--conf spark.yarn.executor.memoryOverhead=2048
spark-submit脚本里面,去用--conf的方式,去添加配置。用new SparkConf().set()这种方式去设置是没有用的!一定要在spark-submit脚本中去设置。
spark.yarn.executor.memoryOverhead(看名字,顾名思义,针对的是基于yarn的提交模式)默认情况下,这个堆外内存上限大概是300M。通常在项目中,真正处理大数据的时候,这里都会出现问题,导致spark作业反复崩溃,无法运行。此时就会去调节这个参数,到至少1G(1024M),甚至说2G、4G。
通常这个参数调节上去以后,就会避免掉某些JVM OOM的异常问题,同时呢,会让整体spark作业的性能,得到较大的提升。
2.executor连接等待时长
Executor1在通过TransferServer拉取其他节点上的Executor2的block manager上的数据时,如果Executor2的task创建的对象特别大,特别多,频繁的造成JVM内存溢出,正在进行垃圾回收,所有的工做线程停止,无法提供给Executor1相应,无法建立网络连接,spark默认的网络连接的超时时长,是60s,如果卡住60s都无法建立连接的话,那么就宣告失败了。数据获取不到,可能会导致spark作业崩溃,导致DAGScheduler反复提交stage,TaskScheduler反复提交 task,大大延长了我们的spark作业时间.
方案:调节连接超时时长:
--conf spark.core.connection.ack.wait.timeout=300
spark-submit脚本,切记,不是在new SparkConf().set()这种方式来设置的。
spark.core.connection.ack.wait.timeout(spark core,connection,连接,ack,wait timeout,建立不上连接的时候,超时等待时长)调节这个值比较大以后,通常来说,可以避免部分的偶尔出现的某某文件拉取失败,某某文件lost掉了。
- Spark性能调优之JVM调优
Spark性能调优之JVM调优 通过一张图让你明白以下四个问题 1.JVM GC机制,堆内存的组成 2.Spark的调优为什么会和JVM的调 ...
- 服务器的tomcat调优和jvm调化
下面讲述的是tomcat的优化,及jvm的优化 Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你.对于操作系统优化来说,是尽可能的增 ...
- Spark(八)JVM调优以及GC垃圾收集器
一JVM结构 1 Java内存结构 JVM内存结构主要有三大块:堆内存.方法区和栈. 堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间.From Survivo ...
- SpringBoot项目优化和Jvm调优(转)
原文:https://blog.csdn.net/wd2014610/article/details/82182617 项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情. 在SpringB ...
- SpringBoot项目优化和Jvm调优(楼主亲测,真实有效)
项目调优 作为一名工程师,项目调优这事,是必须得熟练掌握的事情. 在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行. 在这边有一篇比较好的文章,推荐给大家! Spring ...
- SpringBoot项目优化和Jvm调优
https://www.cnblogs.com/jpfss/p/9753215.html 项目调优 作为一名工程师,项目调优这事,是必须得熟练掌握的事情. 在SpringBoot项目中,调优主要通过配 ...
- jvm调优原则
合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了 ...
- JVM调优参数、方法、工具以及案例总结
这种文章挺难写的,一是JVM参数巨多,二是内容枯燥乏味,但是想理解JVM调优又是没法避开的环节,本文主要用来总结梳理便于以后翻阅,主要围绕四个大的方面展开,分别是JVM调优参数.JVM调优方法(流程) ...
- 【JVM进阶之路】十:JVM调优总结
1.调优原则 JVM调优听起来很高大上,但是要认识到,JVM调优应该是Java性能优化的最后一颗子弹. 比较认可廖雪峰老师的观点,要认识到JVM调优不是常规手段,性能问题一般第一选择是优化程序,最后的 ...
随机推荐
- Oracle Functions转成Ms-Sql procedure
最近公司的一些Oracle项目要转到Ms_sql上,在把Oracle Functions改成MS-Sql的Procedure时,遇到了翻译的问题. 罗列出这些问题: 一.Oracle 基本类型 ora ...
- sass基础
参考:https://www.sass.hk/guide/
- hibernate课程 初探一对多映射1-1 课程简介
hibernate 常见映射类型 one-to-many many-to-one one-to-one many-to-many
- JavaScript比较和逻辑运算符
JavaScript比较和逻辑运算符 JavaScript比较和逻辑运算符 比较和逻辑运算符用于测试true或者false. 比较运算符 比较运算符在逻辑语句中使用,以测定变量或值是否相等 例如设定x ...
- 设置 text-align: center;line-height:height 居中无效
1.设置文字水平居中 内联元素(行内元素)使用: text-align: center: 使用后文字仍然没有居中 解决方法:设置width:100%: 块元素使用: margin: 0 auto; 2 ...
- jQueryMobile(二)
三].按钮 <!-- 一个jQueryMobile页面 --> <div data-role='page'> <div data-role='header'>< ...
- <Android 基础(十七)> ViewPager介绍
介绍 Layout manager that allows the user to flip left and right through pages of data. You supply an i ...
- APK加固之静态脱壳机编写入门
目录: 0x00APK加固简介与静态脱壳机的编写思路 1.大家都知道Android中的程序反编译比较简单,辛苦开发出一个APK轻易被人反编译了,所以现在就有很多APK加固的第三方平台,比如爱加密和梆梆 ...
- tnagios - query handler
启动日志 [root@bjyh-48-86 nagios]# cat nagios.log [1433471109] Nagios 4.1.0rc1 starting... (PID=5136) [1 ...
- EasyUI手风琴 Tab卡使用
--案例项目代码,初始化手风琴,定义打开Tab的方法. $(result).each(function () { //m_pi_jscode,pi_jscode if (m_pi_id != this ...