`

Spark OOM:java heap space,OOM:GC overhead limit exceeded

 
阅读更多

问题描述:

在使用spark过程中,有时会因为数据增大,而出现下面两种错误:

java.lang.OutOfMemoryError: Java heap space

java.lang.OutOfMemoryError:GC overhead limit exceeded

这两种错误之前我一直认为是executor的内存给的不够,但是仔细分析发现其实并不是executor内存给的不足,而是driver的内存给的不足。在standalone client模式下用spark-submit提交任务时(standalone模式部署时,默认使用的就是standalone client模式提交任务),我们自己写的程序(main)被称为driver,在不指定给driver分配内存时,默认分配的是512M。在这种情况下,如果处理的数据或者加载的数据很大(我是从hive中加载数据),driver就可能会爆内存,出现上面的OOM错误。

解决方法:

参考:http://spark.apache.org/docs/latest/configuration.html

方法一:在spark-submit中指定 --driver-memory memSize参数来设定driver的jvm内存大小,可以通过spark-submit --help查看其他可以设置的参数。

eg:

复制代码
./spark-submit \
  --master spark://7070 \
  --class $MAIN_CLASS \
  --executor-memory 3G \
  --total-executor-cores 10 \
  --driver-memory 2g \
  --name $APP_NAME \
  --conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" \
  "$SPARK_APP_JAR" 
复制代码

方法二:在spark_home/conf/目录中,将spark-defaults.conf.template模板文件拷贝一份到/spark_home/conf目录下,命名为spark-defaults.conf,然后在里面设置spark.driver.memory  memSize属性来改变driver内存大小。

eg:

 spark.master                       spark://master:7077
 spark.default.parallelism          10
 spark.driver.memory                2g
 spark.serializer                   org.apache.spark.serializer.KryoSerializer
 spark.sql.shuffle.partitions       50

 

 

 

spark执行任务时出现java.lang.OutOfMemoryError: GC overhead limit exceeded和java.lang.OutOfMemoryError: java heap space

最直接的解决方式就是在spark-env.sh中将下面两个参数调节的尽量大

export SPARK_EXECUTOR_MEMORY=6000Mexport SPARK_DRIVER_MEMORY=7000M

注意,此两个参数设置需要注意大小顺序:

    SPARK_EXECUTOR_MEMORY < SPARK_DRIVER_MEMORY< yarn集群中每个nodemanager内存大小

 

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

(1)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参数覆盖。

(2)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参数值。

(3)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核。

 

分享到:
评论

相关推荐

    java解决nested exception is java.lang.OutOfMemoryError Java heap space

    Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang.OutOfMemoryError: Java heap space"是一个常见的问题,通常发生在程序试图分配超过堆内存限制的空间时。这个错误表明Java虚拟机(JVM...

    java内存溢出原因

    - **错误日志**:`java.lang.OutOfMemoryError: Java heap space` 和 `java.lang.OutOfMemoryError: GC overhead limit exceeded` - **原因**:创建大量对象或者内存泄露可能导致Java堆空间不足。例如,大数据加载...

    Android编译gradle.properties文件及说明

    Android编译gradle.properties文件及说明, 解决Android gradle编译错误OOM:java heap space

    一次OOM问题排查过程实战记录

    Exception in thread http-nio-8080-exec-1027 java.lang.OutOfMemoryError: Java heap space Exception in thread http-nio-8080-exec-1031 java.lang.OutOfMemoryError: Java heap space 看线程名称应该是tomcat的...

    内存溢出解决

    当程序运行时分配给它的内存空间不足以支撑其正常运行时,就会出现“内存溢出”(Out of Memory Error,简称OOM)。这通常发生在堆内存或方法区等内存区域耗尽时。对于Java应用而言,了解如何有效识别并解决内存溢出...

    Spark面对OOM问题的解决方法及优化总结1

    此外,从Spark 1.6.0开始引入了堆外内存,这是一种不在JVM堆上分配的内存,不受GC影响,适合存储大对象。堆外内存可以通过两种方式使用:一是通过`StorageLevel.OFF_HEAP`配合Tachyon;二是通过设置`spark.memory....

    如何解决项目中java heap space的问题

    在Java项目中,java heap space的问题是非常常见的,尤其是在大型项目中,内存溢出导致的OOM(Out of Memory)问题经常会出现。本文将详细介绍如何解决项目中java heap space的问题,并提供了详细的示例代码和解决...

    Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException)

    在Java中,这主要与JVM(Java虚拟机)的内存模型有关,该模型包括堆(Heap)、栈(Stack)、方法区(Method Area)和程序计数器(PC Register)等几个区域。当堆或方法区的内存耗尽时,就会抛出`OutOfMemoryError`。...

    教你分析9种OOM常见原因及解决方案.docx

    2. GC Overhead Limit Exceeded 错误 * 原因分析:应用程序已经基本耗尽了所有可用内存,GC 也无法回收 * 解决方案:检查大对象的合理性、添加机器资源、做限流降级、找到持有的对象、修改代码设计 3. Permgen ...

    高手总结的9种OOM常见原因及解决方案.docx

    高手总结了9种OOM常见原因及解决方案,涵盖Java heap space、GC overhead limit exceeded、Permgen space、Metaspace、Unable to create new native thread等多种情况。 1. Java heap space Java heap space错误...

    快速简单避免OOM的java处理Excel工具

    "快速简单避免OOM的java处理Excel工具"可能指的是阿里巴巴的EasyExcel,这是一个专门为了解决Java处理Excel时的内存问题而设计的开源项目。EasyExcel基于Apache POI,但优化了内存使用,尤其适用于大数据量的读写...

    oom:https的镜像

    oom:https的镜像

    java poi 读取百万数据OOM优化

    本篇文章将重点讨论如何使用Java的Apache POI库以及两种不同的解决方案——EasyExcel和xlsx-Streamer来高效地读取大量Excel数据,避免OOM。 首先,Apache POI是Java中广泛使用的API,用于读写Microsoft Office格式...

    KOOM:KOOM是Kwai在移动平台上的OOM杀手

    implementation ' com.kwai.koom:java-oom:1.0.7 ' } 快速教程 您可以在要启动内存监视时立即设置KOOM,在应用程序启动时进行设置,您可以像这样: public class KOOMApplication extends Applicat

    内存不足OOM java.lang.OutOfMemoryError.

    - 当堆内存不足时,会出现“Java heap space”错误。解决方法包括增大堆大小(通过`-Xms`和`-Xmx`设置初始和最大堆大小),或者优化代码以减少内存消耗。 2. **元空间(Meta Space)**: - 在Java 8及更高版本中...

    OOM:“面向对象的建模”的存储库-2UIB

    本存储库"OOM: 面向对象的建模-2UIB"可能是某个课程或项目的一部分,用于教授和实践面向对象的设计和实现。 面向对象编程(OOP)基于三个主要原则:封装、继承和多态。下面我们将深入探讨这些概念: 1. **封装**:...

    Groovy大量计算导致oom的解决办法

    问题原因分析:使用ScriptEngine.eval每次都会对脚本进行编译,生成一个新的类,被GroovyClassLoader加载,大量执行计算后,将导致被加载的类数量不断增加,最终OOM。 解决办法:对计算的表达式expression进行预...

    JavaCore和HeapDump分析工具

    JavaCore和HeapDump是两种重要的Java应用程序诊断工具,它们用于理解和优化Java应用程序的性能和内存使用情况。在Java运行环境中,遇到性能问题或者内存泄漏时,开发者通常会借助这类工具来定位问题。 JavaCore,也...

Global site tag (gtag.js) - Google Analytics