报错java.lang.OutOfMemoryError: GC overhead limit exceeded

HDFS上有一些每天增长的文件,使用Snappy压缩,突然某天OOM了

1.原因:

因为snappy不能split切片,也就会导致一个文件将会由一个task来读取,读取后解压,数据又会膨胀好多倍,如果文件数太大而且你的并行度也挺大,就会导致大量full gc,最终OOM

为了程序能快速跑起来,只好将最后入HDFS前reparation(500),修改为1000,增加文件数,减少每个文件数据量。

我自己的理解是如果HDFS上的Snappy压缩文件需要Spark等计算框架取读取并且需要切片,那么就要手动将文件大小控制在128MB附近,以使计算效率最大化,但是解压后的数据仍然翻大约3倍




下面记录一下,找问题,修复问题的过程,以及Spark参数调优的过程,很漫长,太菜了。

HDFS上的文件

可以看到一个文件快700MB了,一共500个文件。
当使用Spark读取后做一系列计算就开始报错OOM,用Jstat -gc pid 1000 查看gc情况,发现当执行到stage1的textFile读取文件时就会卡住然后一直进行full GC,最终OOM。

1.以为是数据倾斜,因为总是某个stage某个task执行时卡住

对数据进行抽样查看,发现并没有数据倾斜,基本上没有重复数据

rdd.sample(0.1,false).countByKey().forEach((k,v) ->System.out.println(k+"---"+v));

2.可能内存不够用,或者参数调整的不对,开始调参

**方向:1.加内存、2.堆外内存、3.调JVM参数、4.调整缓存和执行参数比例、5.增加核数增加并行度,减少每个task处理的数据量、6、调整代码增加shuffer时的分区数、6.调整代码先聚和之类的

因为代码比较多,划分的stage比较多,一时间通过WEB UI没看出来是当前stage中哪个算子出现的问题,一直以为是reduceBykey的时候报的错,导致方向找错了,所以怎么调整都是错的
收获就是对调参的了解更熟练了。

1.一开始就以为是执行内存不足所以我将fraction调为0.8,storageFraction调为0.2,不断的增大执行内存,都无济于事。

--conf spark.memory.fraction=0.8
--conf spark.memory.storageFraction=0.3

2.调整代码提前过滤数据之类的全部尝试了,没用。

3.期间我修改了读取文件时的分区数竟然没想到是切片问题,发现不管怎么调整都只有500,当时还在疑惑为啥啊,┭┮﹏┭┮

3.后来看WEB UI中task执行情况,其实卡住的task一直在读取数据,input Size 项是在不断增加的,下面是后来我修改后读取的大小,一直读到700MB,过程很慢,而且如果core数大也就是并行度大的话,我这里320个task并行度,每一个要读取700MB,并且是需要解压的,Snappy解压后3G左右,查看task的errlog会发现日志出现具体我记不清了,大概就是读取xxxx文件3G,通过内存spill到了磁盘多少多少之类的,看到一个task读了这么大,才忽然想起来snappy是不能split切片的

就会导致一个文件使用一个task读取全部数据并解压,最终OOM

也可能我当时参数调整的不好,后面学习并总结了一下内存调参,详见:

https://blog.csdn.net/weixin_43736084/article/details/121541393

参数调整:

# --为了好看换行了
spark-submit --master spark://11.172.54.167:7077
--class $main --deploy-mode client --driver-memory 16g
--executor-memory 25g
--executor-cores 8
--total-executor-cores 320
--conf spark.memory.fraction=0.8
--conf spark.memory.storageFraction=0.3
--conf spark.memory.offHeap.enabled=true
--conf spark.memory.offHeap.size=5g
--conf "spark.executor.extraJavaOptions=-XX:+UseG1GC -XX:-TieredCompilation -XX:G1HeapRegionSize=16m -XX:InitiatingHeapOccupancyPercent=55 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-UseCompressedClassPointers -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:ReservedCodeCacheSize=512m -XX:+UseCodeCacheFlushing -XX:ParallelGCThreads=20 -XX:ConcGCThreads=20 -Xms20g -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"
--jars $jars xxxx.jar $date1 $max $date2  >> log/$log_file#代码内参数
conf.set("spark.driver.maxResultSize", "8g");
conf.set("spark.serialize", "org.apache.spark.serializer.KryoSerializer");
conf.registerKryoClasses(new Class[]{ImmutableBytesWritable.class, HyperLogLog.class, HashSet.class, RegisterSet.class, IllegalArgumentException.class, FileCommitProtocol.TaskCommitMessage.class});
//conf.set("spark.kryo.registrationRequired","true"); #开启的话类没加到上面会报错
conf.set("spark.kryoserializer.buffer.mb", "10");
conf.set("spark.shuffle.file.buffer", "128");
conf.set("spark.reducer.maxSizeInFlight", "144");
conf.set("spark.shuffle.io.maxRetries", "50");
conf.set("spark.shuffle.io.retryWait", "5s");

Spark读取HDFS上的Snappy压缩文件所导致的内存溢出问题 java.lang.OutOfMemoryError: GC overhead limit exceeded相关推荐

  1. spark程序运行异常:java.lang.OutOfMemoryError: GC overhead limit exceeded

    此次异常是在集群上运行的spark程序日志中发现的.由于这个异常导致sparkcontext被终止,以致于任务失败: 出现的一些原因 参考:GC overhead limit exceeded jav ...

  2. 17 记一次 spark 读取大数据表 OOM OutOfMemoryError: GC overhead limit exceeded

    前言 // 呵呵 一天的车, 这就是过年吧!, 但是你还能看到 那一盏为你留的灯, 这可能就是羁绊吧 // 草稿箱 抽一波 呵呵 最近因为一次 测试造了一张 200w 数据记录的表 然后 业务上需要分 ...

  3. spark 读取mongodb失败,报executor time out 和GC overhead limit exceeded 异常

    代码: import com.mongodb.spark.config.ReadConfig import com.mongodb.spark.sql._ val config = sqlContex ...

  4. Spark读取Hdfs上的数据存储在Hbase的ETL过程

    开发:我们再向Hbase中写入数据的时候,尽量批量数据导入,如果一条一条的导入数据,会使得hbase的客户端,频繁的访问habse server,批量导入hbase可以自行参考网上资料规范. pack ...

  5. java 读取hdfs上的文件内容

    用java读取hdfs的文件 直接撸代码: package com.nature.base.util;import com.nature.component.process.vo.DebugDataR ...

  6. hive处理snappy压缩文件

    为什么80%的码农都做不了架构师?>>>    这是WordCount的下集. 上周五往hdfs文件系统上传了620G的文件,然后在上面跑了一个wc(MR)任务,运行3个半小时跑出了 ...

  7. Java读取hdfs目录下所有文件_Java API 读取HDFS目录下的所有文件

    /** * 获取1号店生鲜食品的分类id字符串 * @param filePath * @return */ public String getYHDSXCategoryIdStr(String fi ...

  8. spark大批量读取Hbase时出现java.lang.OutOfMemoryError: unable to create new native thread

    这个问题我去网上搜索了一下,发现了很多的解决方案都是增加的nproc数量,即用户最大线程数的数量,但我修改了并没有解决问题,最终是通过修改hadoop集群的最大线程数解决问题的. 并且网络上的回答多数 ...

  9. 分享一次解决线上java应用导致JVM内存溢出(OOM)的问题

    某个线上的应用运行几天后,总是出现卡死甚至出现OOM的情况. 注:文中图片可能与描述不符,仅作为演示! 通过Linux的top命令查看cpu占比 首先通过top命令查看,发现某个java程序占用了较高 ...

最新文章

  1. 基础知识:页面div始终浮在浏览器顶部
  2. soj 4539 贪心+优先队列
  3. 中以什么开头仅可注释单行_Python从入门到精通第006课--注释与变量
  4. js 字符串截取 获取固定标识字段
  5. MySQL中的常用函数
  6. golang for循环_10. Go语言流程控制:for 循环
  7. 20220117 matlab 全局变量调试
  8. 2018第三方支付牌照公司
  9. poj 1637 Sightseeing tour 混合欧拉图判定
  10. ViT/vit/VIT详解
  11. 硬盘检测软件测试培训,认识专业的考机工具PassMark BurnInTest_软件测试_软件测试培训_软件测试频道_中国IT实验室...
  12. 《Python语言程序设计基础》嵩天著-第6章程序部分练习题答案
  13. 天旦发布开源端口镜像工具,AIOps实践推动数字化转型
  14. Rectangle对象详解
  15. 计算机在条形码的应用,常用一维条码及其应用领域介绍
  16. 导入AOP起步依赖,出现了很多错误
  17. 一款神仙接私活低代码平台,牛到不行!
  18. android控件的对齐方式,控件布局(顶部、底部)留着自用~~~
  19. jQuery项目案例(一):电影排行榜项目
  20. 【新学期、新Flag】我用什么把你留住,我的青春

热门文章

  1. Android学习(二十)Notification通知栏
  2. [剑指offer][JAVA]面试题第[16]题[数值的整数次方][位运算][二分法]
  3. php 函数 数组 难学,php 数组的常用函数
  4. 自动产生fsm代码的工具_代码自动生成工具
  5. BlueTooth 蓝牙音频音质探讨
  6. 计算机网络技术教材多少钱,计算机网络技术课程标准教材.doc
  7. linux边看系统信息,Linux查看系统信息大全[备忘]
  8. python+mysql库+json_用python写爬虫-5.1json用pandas入mysql库
  9. java数据类型及表示范围_Java数据类型及对应取值范围
  10. oracle中exp/imp讲解