Spark 2.x管理与开发-Spark Streaming-性能优化(五)Java虚拟机调优
Posted on 2020-08-11 12:05 MissRong 阅读(149) 评论(0) 收藏 举报Spark 2.x管理与开发-Spark Streaming-性能优化(五)Java虚拟机调优
1.背景
在做虚拟机调优之前,必须先做好:使用高性能的序列化类库、优化数据结构的调优工作,这样才有意义。
如果在计算的时候引入大量数据,那么java虚拟机的垃圾回收就可能成为性能瓶颈。
Java虚拟机会定期的进行垃圾回收,此时就会追踪所有的Java对象,并且在垃圾回收时,找到那些已经不再使用的对象,清理旧对象,来给新对象腾出内存空间。
垃圾回收的性能开端,是跟内存中的对象数量成正比。
2. Spark GC原理

3.检测垃圾回收
我们可以对垃圾回收进行检测,包括多久进行一次垃圾回收,以及每次垃圾回收消耗的时间。
Spark-submit需要添加一个配置:
--conf "spark.executor.extraJavaOptions=-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimesStamps"
解释:
--conf "spark.executor.extraJavaOptions=-verbose:gc 设置GC
-XX:+PrintGCDetails 将GC的明细都打出来
-XX:+PrintGCTimesStamps" 打印出GC的时间戳
注意:这个日志是输出到worker的日志中,而不是Driver日志。

/usr/local/spark-2.1.0-bin-hadoop2.7/logs 存放的是Driver日志

/usr/local/spark-2.1.0-bin-hadoop2.7/work/app-20200705122747-0000 存放的是Worker日志
4. 优化Executor内存检测
目的:减少GC次数
对于GC调优来说,最重要的就是调节RDD缓存占用的内存空间与算子执行时创建对象所占的内存空间的比例。
默认情况下,Spark使用的60%的内存空间来缓存RDD,在task运行时创建对象,只有40%的空间来存放。
在这种情况下,很可能因为内存空间不足,task创建对象过大,触发垃圾回收
极端情况下,很可能会频繁地触发垃圾回收。
使用方式:conf.set("spark.storage.memoryFraction",0.5) 可以降低缓存空间比例
综合使用序列化级别,降低内存消耗

浙公网安备 33010602011771号