spark java.lang.StackOverflowError
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步
1.遇到的问题
在实际分析数据过程中,需要拉取最近一年的数据进行统计,并且一年的数据按天分区。
val ymdSet = TimeUtils.genYmdSet(beginYmd, endYmd) // 获取过去一年时间的日期
var rdd = SparkIo.readThriftParquetFile(spark.sparkContext, pathxxx, classOf[xxx]) for(eachYmd <- ymdSet) {val tmppath = PathUtils.xxx + eachYmdval tmprdd = SparkIo.readThriftParquetFile(spark.sparkContext, tmppath, classOf[xxx])rdd = rdd.union(tmprdd)
}rdd
上面的代码逻辑比较清晰:按照每天的数据生成一个临时的rdd,然后将该rdd不停union到最初的rdd上,得到最终一年的数据。
当只选择过去7天的数据进行分析的时候,上面的代码没有问题可以正常运行。当代码读取的数据变为过去一整年时,会抛出异常
ERROR executor.Executor: Exception in task 28.0 in stage 0.0 (TID 28)
java.lang.StackOverflowErrorat java.lang.Exception.<init>(Exception.java:102)at java.lang.ReflectiveOperationException.<init>(ReflectiveOperationException.java:89)at java.lang.reflect.InvocationTargetException.<init>(InvocationTargetException.java:72)at sun.reflect.GeneratedSerializationConstructorAccessor13.newInstance(Unknown Source)at java.lang.reflect.Constructor.newInstance(Constructor.java:526)at java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:967)at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1782)at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1706)at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1344)at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)......
2.原因分析
从异常来看,是使用java.io.ObjectInputStream序列化的时候出现了死循环导致。
结合前面的现象,7天数据的时候没问题,而一年的数据会有异常,主要是一年的数据文件量太大,导致栈空间不足。不停的union过程,导致了rdd的lineage太长,最终导致栈空间的不足。因为每执行一次union操作,就会给lineage的步长加1。
3.解决方案
既然定位到了问题,那解决方案就出来了,无非是两种方式
1.加大栈空间。
2.减少lineage的长度。
加大栈空间是个治标不治本的方案,因为集群的资源始终是有限的,而且一次处理太大的数据,始终是个隐患,所以最终采取了第二种方案,减少lineage长度。
具体实施也比较简单
def genrdd(startYmd: String, endYmd: String) = {val ymdSet = TimeUtils.genYmdSet(beginYmd, endYmd) // 获取过去一段时间的日期var rdd = SparkIo.readThriftParquetFile(spark.sparkContext, pathxxx, classOf[xxx]) for(eachYmd <- ymdSet) {val tmppath = PathUtils.xxx + eachYmdval tmprdd = SparkIo.readThriftParquetFile(spark.sparkContext,tmppath,classOf[xxx])rdd = rdd.union(tmprdd)
}rdd
}
首先将生成rdd的逻辑封装成一个方法,方法的参数为起止时间。
然后,将一年的时间段拆开,比如拆成4段,每段3个月,分别得到起止时间。
最后,将该方法调用4次,最后union到一起,就可以成功将一年的数据合并。
spark java.lang.StackOverflowError相关推荐
- Spark出现java.lang.stackoverflowerror的解决方法
正在测试的程序需要多次迭代(400+次),每次迭代有复杂的运算 迭代到100多次的时候报java.lang.stackoverflowerror的错误 解决方法:先checkpoint()再count ...
- 科学处理java.lang.StackOverflowError: null异常
java.lang.StackOverflowError: null异常处理 在项目运行中出现StackOverflowError 首先要检查在编码中是否有明显的递归编码,比如死循环或者无限循环调用. ...
- java.sql.SQLException: java.lang.StackOverflowError
2019独角兽企业重金招聘Python工程师标准>>> 今天用jsp自定义标签实现一个小功能:刷新某个页面,通过自定义标签的后台tag方法去数据库查询所需数据,这样,当页面刷新完成之 ...
- java.lang.StackOverflowError 解决方法
java.lang.StackOverflowError 解决方法 参考文章: (1)java.lang.StackOverflowError 解决方法 (2)https://www.cnblogs. ...
- 【错误记录】Groovy 函数拦截调用 invokeMethod 导致栈溢出 ( java.lang.StackOverflowError )
文章目录 一.报错信息 二.解决方案 一.报错信息 使用 Groovy 函数拦截功能 , 定义 Groovy 类 , 实现 GroovyInterceptable 接口 , 并重写 invokeMet ...
- java.lang.StackOverflowError递归的栈溢出错误
递归在JAVA中是指方法本身调用自己,以此来解决问题普通循环不太容易解决的问题. 递归能解决一些特定的问题,但相对的也有其缺点.递归运行速度较慢,在递归调用过 程中系统为每一层返回点,局部量等提供栈来 ...
- Java EE之Hibernate异常总结【5】java.lang.StackOverflowError[栈溢出]
Java EE之Hibernate异常总结[5]java.lang.StackOverflowError[栈溢出] 参考文章: (1)Java EE之Hibernate异常总结[5]java.lang ...
- 关于使用JAVA正则表达式报java.lang.StackOverflowError错误问题
最近在使用hadoop做apache日志分析,发现测试数据没问题,但数据一多就出问题,报 java.lang.StackOverflowError错误,最后定位为正则表达式栈溢出,发现某些行的日志数据 ...
- 小林子的日常维护之-java.lang.StackOverflowError: null
背景:多级指标看板展示(每个指标都有一个父级指标id来维护指标树) 问题排查:找到错误原因并且修复 报错日志如下: 2021-11-28 14:40:15 [http-nio-9000-exec-23 ...
- AppWidgetService创建报错java.lang.StackOverflowError: stack size 8MB
问题描述 Android7.1在创建AppWidgetService服务的时候报错 01-02 02:51:18.607 I/SystemServiceManager( 1700): Starting ...
最新文章
- 学习Python语言 基础语法:变量的基本使用
- 在SMARTFORMS中取消使用WORD作为编辑器
- 四十八、第二份国外的Python考试(下篇)
- 【机器学习】分类算法-sklearn转换器和估计器
- WebClient 通过get和post请求api
- 昨天凌晨故宫网站崩了,被众多人“围攻”!留言亮了...
- VC学习笔记:状态栏
- 欧姆龙OMRON CP1H PLC与台达 DOP-B触摸屏通讯
- 倾听开源Android的另类声音
- 不打补贴战,快狗打车凭什么冲刺“同城货运第一股”?
- Vue项目中完成谷歌统计和百度统计功能
- 输入一个字符串,判断它的所有字符中否全部是大写字母,如不是,统计小写字母个数,并将其转换成大写字母后输出
- android驱动wifi芯片,Android驱动——Wlan驱动
- mysql 常用查询语句
- linux中修改某行某列字符串,Linux替换指定列的字符串(awk 命令)
- 快速学习-RocketMQ-“Request-Reply”特性
- 会计 应用计算机,会计从业会计电算化:计算机的主要应用
- 旷视2022:以产品之能加速行业发展,以生态之力开拓AIoT蓝海
- bootstrap 样式下 Se7en 模板使用(1)操作提示信息框
- [附源码]Python计算机毕业设计Django医院门诊管理信息系统
热门文章
- 如何把握好 transition 和 animation 的时序,创作描边按钮特效...
- CA证书服务器(6) 利用CA证书配置安全Web站点
- 安防的未来五年 如何把握机遇深耕市场?
- 进程cpu使用率的计算
- 索引、视图和同义词、序列
- WinForm 使用 HttpUtility
- 【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面...
- 大型门户网站架构分析[转]
- Java 接口和抽象类的异同点
- gluoncv 目标检测,训练自己的数据集