Java虚拟机调优
1、背景:
如果在持久化RDD的时候,持久化了大量的数据,那么Java虚拟机的垃圾回收就可能成为一个性能瓶颈。
Java虚拟机会定期进行垃圾回收,此时就会追踪所有Java对象,并且在垃圾回收时,追中找到那些已经不再使用的对象,清理旧对象,给新对象腾出空间。
垃圾回收的性能开销,和内存中的对象数量成正比。
在做Java虚拟机调优前,必须要做好上面其他调优工作,这样才有意义。
因为上面的调优工作,是为了节省内存的开销。
2、GC 原理
3、监测垃圾回收。
我们可以对垃圾回收进行监测,包括多久进行一次垃圾回收,以及每次垃圾回收耗费的事件。
在 spark-submit脚本中,添加一个配置:
--conf "spark.executor.extraJavaOptions=-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimesStamps"
注意:输出到worker的日志中,而不是driver日志。
/usr/local/spark-2.1.0-bin-hadoop2.7/work/app-20190705055405-0000/0
driver日志
/usr/local/spark-2.1.0-bin-hadoop2.7/logs
worker日志
4、优化Executor内存比例
目的:减少垃圾回收。
对于GC调优来说,最重要的调节,RDD缓存占用的内存空间 与 算子执行是创建对象所占用的内存空间 的比例。
默认情况下,Spark使用每个Executor 60%的内存空间来缓存RDD,那么在task执行期间创建的对象,只有40%的内存空间来存放。
在这种情况下,很有可能因为内存不足,task创建的对象过大,导致40%的内存空间不够用,触发Java虚拟机垃圾回收操作。
在极端的情况下,垃圾回收操作会被频繁触发。
方法:
conf.set("spark.storage.memoryFraction",0.5)
将RDD缓存占用空间比例降低到50%
七、shuffle
spark 2.0以后,shuffle调优问题已经被 spark 官方解决。但是1.x中,还有问题。
Spark内核博客
https://ymgd.github.io/codereader/2018/03/03/%E6%B7%B1%E5%85%A5Spark%E5%86%85%E6%A0%B8/