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", "");
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", ""); //调节每次拉取数据时最大等待时长(默认为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();
spark性能调优05-troubleshooting处理的更多相关文章
- Spark性能调优之代码方面的优化
Spark性能调优之代码方面的优化 1.避免创建重复的RDD 对性能没有问题,但会造成代码混乱 2.尽可能复用同一个RDD,减少产生RDD的个数 3.对多次使用的RDD进行持久化(ca ...
- [Spark性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析
本課主題 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质 ...
- Spark性能调优之合理设置并行度
Spark性能调优之合理设置并行度 1.Spark的并行度指的是什么? spark作业中,各个stage的task的数量,也就代表了spark作业在各个阶段stage的并行度! 当分配 ...
- Spark性能调优之资源分配
Spark性能调优之资源分配 性能优化王道就是给更多资源!机器更多了,CPU更多了,内存更多了,性能和速度上的提升,是显而易见的.基本上,在一定范围之内,增加资源与性能的提升,是成正比的:写完了 ...
- Spark性能调优之Shuffle调优
Spark性能调优之Shuffle调优 • Spark底层shuffle的传输方式是使用netty传输,netty在进行网络传输的过程会申请堆外内存(netty是零拷贝),所以使用了堆外内存. ...
- Spark性能调优之解决数据倾斜
Spark性能调优之解决数据倾斜 数据倾斜七种解决方案 shuffle的过程最容易引起数据倾斜 1.使用Hive ETL预处理数据 • 方案适用场景:如果导致数据倾斜的是Hive表.如果该Hiv ...
- Spark性能调优之JVM调优
Spark性能调优之JVM调优 通过一张图让你明白以下四个问题 1.JVM GC机制,堆内存的组成 2.Spark的调优为什么会和JVM的调 ...
- Spark性能调优
Spark性能优化指南——基础篇 https://tech.meituan.com/spark-tuning-basic.html Spark性能优化指南——高级篇 https://tech.meit ...
- spark性能调优 数据倾斜 内存不足 oom解决办法
[重要] Spark性能调优——扩展篇 : http://blog.csdn.net/zdy0_2004/article/details/51705043
- spark 性能调优(一) 性能调优的本质、spark资源使用原理、调优要点分析
转载:http://www.cnblogs.com/jcchoiling/p/6440709.html 一.大数据性能调优的本质 编程的时候发现一个惊人的规律,软件是不存在的!所有编程高手级别的人无论 ...
随机推荐
- .gz文件解压
有时我们明明已经使用gunzip命令解压.gz文件了,可解压生成的文件却依然无法正常读取.如输入命令gunzip HelloWorld.java.gz后,解压生成HelloWorld.java文件,却 ...
- Python中sys模块
Python的sys模块提供访问解释器使用或维护的变量,和与解释器进行交互的函数.通俗来讲,sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python运行时的环境. ...
- 同一台机器上有多个Python版本?
有关Python网站上的官方文档,如何在Linux上的同一台机器上安装和运行多个版本的Python? 我可以找到大量的博客帖子和答案,但我想知道是否有“标准”官方方式这样做? 或者这完全取决于操作系统 ...
- go 复合数据类型
数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成.因为数组的长度是固定的,因此在Go语言中很少直接使用数组. 数组声明方式: #第一种 ] int balance ...
- HDU 3406 Baseball of Planet Pandora
Baseball of Planet Pandora Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- redux和react-redux
redux和react-redux的关系: redux是react的状态管理工具,却不仅仅只是为了react而生的,所以在使用中会存在痛点.而react-redux是专门为了react定制,目的是为了 ...
- MYSQL 查询脚本优化
业务需要,优化一段多表查询脚本. 总结下来,采取以下步骤. 分析语句 分析语句,了解逻辑,是否可以先优化逻辑. 查询语句的查询范围,是否是全表查询,如果是,尽量优化为按索引查询. 查看语句数量,是否有 ...
- for循环(C语言型)举例
- services - Internet 网络服务列表
DESCRIPTION(描述) services 是一个普通的 ASCII 码文件, 它在 internet 服务的友好原文名以及这些服务预先分配的端口和协议类型之间提供了映射. 每个联网程序必须查找 ...
- 怎么更新 WIN10里的SMBv1协议
控制面板 ---启用或关闭Windows功能---打开SMBv1服务: