环境:
spark version :1.5.2
运行模式:standalone
过程分析 :
集群上跑着大量任务,但发现集群每运行两天就会挂掉一次。挂掉后集群所有work进程和master进程都会死掉。于是查看work进程日志:
于是再查看Master进程日志发现报OOM:
java.lang.OutOfMemoryError: GC overhead limit execeeded
由于读过Storage模块源码,得知缓存数据和Master进程无关。于是通过jstat工具监控了一下Master进程,发现每当任务执行完关闭后,
Master进程的jvm老年代占用会直线飙高。无意间想到会不会和日志记录有关,查了一下果然,Spark的History默认会将50个执行完的application
的一些信息(ui界面要显示的内容)加载到Master进程中,由于我们的任务复杂度高,有些任务的日志已经达到150M,这些大数据会直接被
加载到jvm老年代中,当老年代撑满,执行多次full gc后也释放不掉,所有就报了 GC overhead limit execeeded异常。
解决方案 :
由于我们集群内存资源有限,已不可能再加大Master进程内存大小,所以只能考虑通过配置来解决
查询了一下文档发现有一个配置项: spark.history.retainedApplications 该参数会控制加载在内存中的application日志数量。 但是通过
配置该配置项发现内存还是会gc不掉,不知算不算是BUG。再查文档发现了另一个配置项:spark.deploy.retainedApplications 该配置项是控制
ui页面上显示的历史application数量。在spark-env.sh 中增加 : export SPARK_MASTER_OPTS="-Dspark.deploy.retainedApplications=5" 再次监控
jvm发现当老年代撑满后会执行一次full gc释放掉内存,至此,问题解决。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29754888/viewspace-2063153/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29754888/viewspace-2063153/