执行sparksql出现OOM问题

摘要:
而我们这里主要是因为SparkSql在获取Hive元数据信息、SQL解析等进行序列化反序列化过程中中间可能产生较多的class文件。PermSize,如果是yarn-client模式,则是默认读取spark-class文件中的JAVA_OPTS="-XX:MaxPermSize=256m$OUR_JAVA_OPTS"值;如果是yarn-cluster模式,读取的是spark-default.conf文件中的spark.driver.extraJavaOptions对应的JVM参数值。GC方式,两种模式都是读取的是spark-default.conf文件中的spark.executor.extraJavaOptions对应的JVM参数值。

一开始使用yarn-client模式提交作业时一切正常,但换成cluster模式下
使用sparksql方法执行hive查询语句时,却出现了如下的OOM问题:

Exception in thread "Thread-3" java.lang.OutOfMemoryError: PermGen space

出现这个错误原主要原因是太多的类或者太大的类都被加载到永久代,导致存储器中永久代的内存耗尽。而我们这里主要是因为SparkSql在获取Hive元数据信息、SQL解析等进行序列化反序列化过程中中间可能产生较多的class文件。

解决方法就是增加对Driver的JVM配置,因为Driver才负责SQL的解析和元数据获取。例如在提交作业时:
--conf "spark.driver.extraJavaOptions=-XX:PermSize=128M -XX:MaxPermSize=256M"
但是为什么在yarn-client模式运行时是正常的呢,网上查了下,原来在*$SPARK_HOME/bin/spark-class*文件中已经设置了永久代大小:
JAVA_OPTS="-XX:MaxPermSize=256m $OUR_JAVA_OPTS"
当以yarn-client模式运行时,driver就运行在客户端的spark-submit进程中,其JVM参数是取的spark-class文件中的设置,所以没有出现永久代溢出现象。

总结一下Spark中各个角色的JVM参数设置:

  • Driver的JVM参数:

-Xmx,-Xms,如果是yarn-client模式,则默认读取spark-env文件中的SPARK_DRIVER_MEMORY值,-Xmx,-Xms值一样大小;如果是yarn-cluster模式,则读取的是spark-default.conf文件中的spark.driver.extraJavaOptions对应的JVM参数值。

PermSize,如果是yarn-client模式,则是默认读取spark-class文件中的JAVA_OPTS="-XX:MaxPermSize=256m $OUR_JAVA_OPTS"值;如果是yarn-cluster模式,读取的是spark-default.conf文件中的spark.driver.extraJavaOptions对应的JVM参数值。

GC方式,如果是yarn-client模式,默认读取的是spark-class文件中的JAVA_OPTS;如果是yarn-cluster模式,则读取的是spark-default.conf文件中的spark.driver.extraJavaOptions对应的参数值。
以上值最后均可被spark-submit工具中的–driver-java-options参数覆盖。

  • Executor的JVM参数:

-Xmx,-Xms,如果是yarn-client模式,则默认读取spark-env文件中的SPARK_EXECUTOR_MEMORY值,-Xmx,-Xms值一样大小;如果是yarn-cluster模式,则读取的是spark-default.conf文件中的spark.executor.extraJavaOptions对应的JVM参数值。

PermSize,两种模式都是读取的是spark-default.conf文件中的spark.executor.extraJavaOptions对应的JVM参数值。

GC方式,两种模式都是读取的是spark-default.conf文件中的spark.executor.extraJavaOptions对应的JVM参数值。

  • Executor数目及所占CPU个数

如果是yarn-client模式,Executor数目由spark-env中的SPARK_EXECUTOR_INSTANCES指定,每个实例的数目由SPARK_EXECUTOR_CORES指定;如果是yarn-cluster模式,Executor的数目由spark-submit工具的–num-executors参数指定,默认是2个实例,而每个Executor使用的CPU数目由–executor-cores指定,默认为1核。
每个Executor运行时的信息可以通过yarn logs命令查看到,类似于如下:

14/08/13 18:12:59 INFO org.apache.spark.Logging$class.logInfo(Logging.scala:58): Setting up executor with commands: List($JAVA_HOME/bin/java, -server, -XX:OnOutOfMemoryError='kill %p', -Xms1024m -Xmx1024m , -XX:PermSize=256M -XX:MaxPermSize=256M -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:/tmp/spark_gc.log, -Djava.io.tmpdir=$PWD/tmp, -Dlog4j.configuration=log4j-spark-container.properties, org.apache.spark.executor.CoarseGrainedExecutorBackend, akka.tcp://spark@sparktest1:41606/user/CoarseGrainedScheduler, 1, sparktest2, 3, 1>, <LOG_DIR>/stdout, 2>, <LOG_DIR>/stderr)

其中,akka.tcp://spark@sparktest1:41606/user/CoarseGrainedScheduler表示当前的Executor进程所在节点,后面的1表示Executor编号,sparktest2表示ApplicationMaster的host,接着的3表示当前Executor所占用的CPU数目。

参考来源:

Scott007 - 博客园

jvm - Spark Sql is throwing PermGen Space Error - Stack Overflow

免责声明:文章转载自《执行sparksql出现OOM问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇事务与锁docker 部署 HFish(集群部署)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java:线上问题排查常用手段(转)

出处: java:线上问题排查常用手段 一、jmap找出占用内存较大的实例 先给个示例代码: import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; /** * Created by 菩提树下的杨过 on 0...

pyspark 针对Elasticsearch的读写操作

1.创建spark与Elasticsearch的连接 为了对Elasticsearch进行读写操作,需要添加Elasticsearch的依赖包,其中,添加依赖包(org.elasticsearch_elasticsearch-spark-20_2.11-6.8.7.jar)有下面的三种方式: 1)将依赖包直接放在安装spark目录下面的jars目录下,即可...

JVM 常用命令

对于有图形化界面的用户来,jconsole就可以搞定,界面使用很简单 还可以查看很多信息,例如检测死锁。 下面是没有图形化界面的系统 可以用命令 : jps 查看jvm 进程 jstack -l 6088 查看 jvm 启动参数的命令 root@VM-185-251-ubuntu:/home/ubuntu#jinfo -flags 17809 返回值如下...

“There appears to be trouble with your network connection. Retrying”

网上很多答案都说是代理问题,不过,设置了代理还是提示这个,后来删除了 yarn.lock 文件后重新 yarn 就好了。估计是 yarn.lock 中包的路径有错,所以一直加载失败。出现此问题可能是 npm 和 yarn 混用导致的。当然,也有可能真的是网络问题。 删了 yarn.lock 文件依然无效可以试下设置代理镜像 yarn config set...

java.lang.OutOfMemoryError: unable to create new native thread问题排查以及当前系统最大进程数量

1. 问题描述 线上某应用出问题,查看日志 这一组服务器是2台,每台都有。配置为64G,使用7G,空余内存非常多 2. 问题排查 环境变化:程序迁移到新机器,新机器是CentOS 7,程序运行账号由原来的root改为work。硬件配置由32G升级为64G。首先切换到work账号,然后运行一个测试程序就是建立线程,发现只能跑2900多个,我的笔记本还能跑2...

JVM监控及分析(01)

一、引入 进入tomcat下的webapps文件夹中,将test1.war上传至该目录下,重启tomcat: sh startup.sh && tail -f ../logs/catalina.out 这时候tomcat会自动解压war包,文件夹文件如下: 在浏览器中访问该项目jsp文件的地址: 使用JMeter对该地址进行压测,录制h...