• spark性能调优05-troubleshooting处理


    1、调节reduce端缓冲区大小避免OOM异常

      1.1 为什么要调节reduce端缓冲区大小

        对于map端不断产生的数据,reduce端会不断拉取一部分数据放入到缓冲区,进行聚合处理;

        当map端数据特别大时,reduce端的task拉取数据是可能全部的缓冲区都满了,此时进行reduce聚合处理时创建大量的对象,导致OOM异常;

      1.2 如何调节reduce端缓冲区大小

        当由于以上的原型导致OOM异常出现是,可以通过减小reduce端缓冲区大小来避免OOM异常的出现

        但是如果在内存充足的情况下,可以适当增大reduce端缓冲区大小,从而减少reduce端拉取数据的次数,提供性能。

    //调节reduce端缓存的大小(默认48M)
    conf.set("spark.reducer.maxSizeInFlight", "24");

    2、解决JVM GC导致的shuffle文件拉取失败

      2.1 问题描述

        下一个stage的task去拉取上一个stage的task的输出文件时,如果正好上一个stage正处在full gc的情况下(所有线程后停止运行),它们之间是通过netty进行通信的,就会出现很长时间拉取不到数据,此时就会报shuffle file not found的错误;但是下一个stage又重新提交task就不会出现问题了。

      2.2 如何解决

        调节最大尝试拉取次数:spark.shuffle.io.maxRetries 默认为3次

        调节每次拉取最大的等待时长:spark.shuffle.io.retryWait 默认为5秒

    //调节拉取文件的最大尝试次数(默认3次)
    conf.set("spark.shuffle.io.maxRetries", "60");
            
    //调节每次拉取数据时最大等待时长(默认为5s)
    conf.set("spark.shuffle.io.retryWait", "5s");

     3、yarn队列资源不足导致application直接失败

      3.1 问题描述

        如果yarn上的spark作业已经消耗了一部分资源,如果现在再提交一个spark作业,可能会出现以下两个情况:第一、发现yarn资源不足,直接打印fail的log,直接就失败;第二、发现yarn资源不足,该作业就一直处于等待状态,等待分配资源执行。

      3.2 如何解决

        如果发生了上面的第一种问题,可以通过以下方式解决

        方法一:限制同一时间内只有一个spark作业提交到yarn上,确保spark作业的资源是充足的(调节同一时间内每个spark能充分使用yarn的最大资源)。

        方法二:将长时间的spark作业和短时间的spark作业分别提交到不同的队列里(通过线程池的方式实现)。

    4、序列化导致的错误

      4.1 问题描述

        如果日志信息出现了Serializable、Serialize等错误信息

      4.2 如何解决

        4.2.1 如果算子函数中使用到外部的自定义的变量,自定义类型需要实行Serializable接口

        4.2.2 如果RDD中使用到自定义的数据类型,自定义类型需要实行Serializable接口

        4.2.3 以上两种情况的类型,不能使用第三方提供的没有实现Serializable接口的类型

    5、算子函数返回NULL导致的错误

      5.1 问题描述

        有些算子函数需要有返回值,但是有些数据,就是不想返回任何数据,此时如果返回NULL,可能会导致错误。

      5.2 如何解决

        先返回一个固定的值,之后进行过滤掉指定的数据即可。

    6、yarn-cluster模式的JVM内存溢出无法执行的问题

      5.1 问题描述

        有些spark作业,在yarn-client模式下是可以运行的,但在yarn-cluster模式下,会报出JVM的PermGen(永久代)的内存溢出,OOM.

        出现以上原因是:yarn-client模式下,driver运行在本地机器上,spark使用的JVM的PermGen的配置,是本地的默认配置128M;

              但在yarn-cluster模式下,driver运行在集群的某个节点上,spark使用的JVM的PermGen是没有经过默认配置的,默认是82M,故有时会出现PermGen Out of Memory error log.

      5.2 如何处理

        在spark-submit脚本中设置PermGen

        --conf spark.driver.extraJavaOptions="-XX:PermSize=128M -XX:MaxPermSize=256M"(最小128M,最大256M)

        如果使用spark sql,sql中使用大量的or语句,可能会报出jvm stack overflow,jvm栈内存溢出,此时可以把复杂的sql简化为多个简单的sql进行处理即可。

     7、checkpoint的使用

      7.1 checkpoint的作用

        默认持久化的Rdd会保存到内存或磁盘中,下次使用该Rdd时直接冲缓存中获取,不需要重新计算;如果内存或者磁盘中文件丢失,再次使用该Rdd时需要重新进行。

        如果将持久化的Rdd进行checkpoint处理,会把内存写入到hdfs文件系统中,此时如果再次使用持久化的Rdd,但文件丢失后,会从hdfs中获取Rdd并重新进行缓存。

      7.2 如何使用

        首先设置checkpoint目录

    //设置checkpoint目录
    javaSparkContext.checkpointFile("hdfs://hadoop-senior.ibeifeng.com:8020/user/yanglin/spark/checkpoint/UserVisitSessionAnalyzeSpark");

        将缓存后的Rdd进行checkpoint处理

    //将缓存后的Rdd进行checkpoint
    sessionRowPairRdd.checkpoint();

        

  • 相关阅读:
    System.Security.Cryptography.CryptographicException: 系统找不到指定的文件。
    AOP之三 Java平台研究
    c#中对"Crossthread operation not valid"错误的处理办法
    AOP之二 技术基础
    Fedora14安装Nvidia驱动的过程
    undefined reference问题总结
    深度解析VC中的消息传递机制
    DLL导出类方法
    VC++中把一个对话框最小化到托盘
    AOP之四 .Net平台研究
  • 原文地址:https://www.cnblogs.com/lifeone/p/6473035.html
Copyright © 2020-2023  润新知