项目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相关推荐

  1. Spark出现java.lang.stackoverflowerror的解决方法

    正在测试的程序需要多次迭代(400+次),每次迭代有复杂的运算 迭代到100多次的时候报java.lang.stackoverflowerror的错误 解决方法:先checkpoint()再count ...

  2. 科学处理java.lang.StackOverflowError: null异常

    java.lang.StackOverflowError: null异常处理 在项目运行中出现StackOverflowError 首先要检查在编码中是否有明显的递归编码,比如死循环或者无限循环调用. ...

  3. java.sql.SQLException: java.lang.StackOverflowError

    2019独角兽企业重金招聘Python工程师标准>>> 今天用jsp自定义标签实现一个小功能:刷新某个页面,通过自定义标签的后台tag方法去数据库查询所需数据,这样,当页面刷新完成之 ...

  4. java.lang.StackOverflowError 解决方法

    java.lang.StackOverflowError 解决方法 参考文章: (1)java.lang.StackOverflowError 解决方法 (2)https://www.cnblogs. ...

  5. 【错误记录】Groovy 函数拦截调用 invokeMethod 导致栈溢出 ( java.lang.StackOverflowError )

    文章目录 一.报错信息 二.解决方案 一.报错信息 使用 Groovy 函数拦截功能 , 定义 Groovy 类 , 实现 GroovyInterceptable 接口 , 并重写 invokeMet ...

  6. java.lang.StackOverflowError递归的栈溢出错误

    递归在JAVA中是指方法本身调用自己,以此来解决问题普通循环不太容易解决的问题. 递归能解决一些特定的问题,但相对的也有其缺点.递归运行速度较慢,在递归调用过 程中系统为每一层返回点,局部量等提供栈来 ...

  7. Java EE之Hibernate异常总结【5】java.lang.StackOverflowError[栈溢出]

    Java EE之Hibernate异常总结[5]java.lang.StackOverflowError[栈溢出] 参考文章: (1)Java EE之Hibernate异常总结[5]java.lang ...

  8. 关于使用JAVA正则表达式报java.lang.StackOverflowError错误问题

    最近在使用hadoop做apache日志分析,发现测试数据没问题,但数据一多就出问题,报 java.lang.StackOverflowError错误,最后定位为正则表达式栈溢出,发现某些行的日志数据 ...

  9. 小林子的日常维护之-java.lang.StackOverflowError: null

    背景:多级指标看板展示(每个指标都有一个父级指标id来维护指标树) 问题排查:找到错误原因并且修复 报错日志如下: 2021-11-28 14:40:15 [http-nio-9000-exec-23 ...

  10. AppWidgetService创建报错java.lang.StackOverflowError: stack size 8MB

    问题描述 Android7.1在创建AppWidgetService服务的时候报错 01-02 02:51:18.607 I/SystemServiceManager( 1700): Starting ...

最新文章

  1. 学习Python语言 基础语法:变量的基本使用
  2. 在SMARTFORMS中取消使用WORD作为编辑器
  3. 四十八、第二份国外的Python考试(下篇)
  4. 【机器学习】分类算法-sklearn转换器和估计器
  5. WebClient 通过get和post请求api
  6. 昨天凌晨故宫网站崩了,被众多人“围攻”!留言亮了...
  7. VC学习笔记:状态栏
  8. 欧姆龙OMRON CP1H  PLC与台达 DOP-B触摸屏通讯
  9. 倾听开源Android的另类声音
  10. 不打补贴战,快狗打车凭什么冲刺“同城货运第一股”?
  11. Vue项目中完成谷歌统计和百度统计功能
  12. 输入一个字符串,判断它的所有字符中否全部是大写字母,如不是,统计小写字母个数,并将其转换成大写字母后输出
  13. android驱动wifi芯片,Android驱动——Wlan驱动
  14. mysql 常用查询语句
  15. linux中修改某行某列字符串,Linux替换指定列的字符串(awk 命令)
  16. 快速学习-RocketMQ-“Request-Reply”特性
  17. 会计 应用计算机,会计从业会计电算化:计算机的主要应用
  18. 旷视2022:以产品之能加速行业发展,以生态之力开拓AIoT蓝海
  19. bootstrap 样式下 Se7en 模板使用(1)操作提示信息框
  20. [附源码]Python计算机毕业设计Django医院门诊管理信息系统

热门文章

  1. 如何把握好 transition 和 animation 的时序,创作描边按钮特效...
  2. CA证书服务器(6) 利用CA证书配置安全Web站点
  3. 安防的未来五年 如何把握机遇深耕市场?
  4. 进程cpu使用率的计算
  5. 索引、视图和同义词、序列
  6. WinForm 使用 HttpUtility
  7. 【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面...
  8. 大型门户网站架构分析[转]
  9. Java 接口和抽象类的异同点
  10. gluoncv 目标检测,训练自己的数据集