1. 2019-03-19 02:50:24 WARN TaskSetManager:66 - Lost task 1.0 in stage 0.0 (TID 1, 1.2.3.4, executor 1): java.io.InvalidClassException: xxx.xxx.spark.xxx.xxx.Test; no valid constructor
  2. at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:157)
  3. at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:862)
  4. at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2041)
  5. at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
  6. at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2285)
  7. at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2209)
  8. at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2067)
  9. at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
  10. at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2285)
  11. at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2209)
  12. at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2067)
  13. at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
  14. at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2285)
  15. at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2209)
  16. at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2067)
  17. at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
  18. at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2285)
  19. at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2209)
  20. at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2067)
  21. at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
  22. at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2285)
  23. at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2209)
  24. at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2067)
  25. at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
  26. at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
  27. at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75)
  28. at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114)
  29. at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:80)
  30. at org.apache.spark.scheduler.Task.run(Task.scala:109)
  31. at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
  32. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  33. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  34. at java.lang.Thread.run(Thread.java:748)

如果你执行spark的job时出现上面这个错误,同时满足以下条件

1、存在抽象父类

2、抽象父类中存在有参数的构造方法

3、子类实现了序列化接口,父类没有实现

那么恭喜你,来对地方了,解决方法非常简单,实现抽象父类的默认无参数构造方法就可以

下面代码的第9行

  1. public abstract class AbBaseThread extends Thread {
  2.  
  3. protected SparkSession session;
  4.  
  5. protected JavaSparkContext jsc;
  6.  
  7. private SparkParam sp;
  8.  
  9. public AbBaseThread() {}
  10.  
  11. public AbBaseThread(SparkSession session, SparkParam sp) {
  12. this.session = session;
  13. this.jsc = new JavaSparkContext(session.sparkContext());
  14. this.sp = sp;
  15. }
  16.  
  17. public abstract String execute(SparkParam sp);
  18.  
  19. public void run() {
  20. String result = this.execute(sp);
  21. Jedis jedis = RedisUtil.getJedis();
  22. jedis.set(sp.getUuid(), result);
  23. RedisUtil.returnResource(jedis);
  24. }
  25.  
  26. }

为什么会出现上面这个问题,我在这里强行解释一波:

1、子类序列化的时候,因为父类没有实现序列化接口,所以序列化的流中不存在父类相关的信息

2、反序列化子类对象和直接实例化一个子类对象的原理应该差不多,所以在反序列子类的时候也是先有父类对象再有子类对象,父类怎么来的,调用默认的无参构造函数来的。

spark 报错 InvalidClassException: no valid constructor的更多相关文章

  1. spark报错处理

    Spark报错处理 1.问题:org.apache.spark.SparkException: Exception thrown in awaitResult 分析:出现这个情况的原因是spark启动 ...

  2. 报错:The valid characters are defined in RFC 7230 and RFC 3986

    访问 spring boot controller时,报错:The valid characters are defined in RFC 7230 and RFC 3986 1.特殊符号 @Spri ...

  3. Appium 1.9.1 启动报错 Fatal TypeError: Class constructor BaseDriver cannot be invoked without 'new'

    安装了appium 1.9.1后一直报错Fatal TypeError: Class constructor BaseDriver cannot be invoked without 'new',无法 ...

  4. spark报错:invalid token

    启动spark报错,启动container失败,去看yarn的日志,显示invalid token, 经过排查是hadoop子节点的配置和主节点的配置不一致导致的,同步之后,问题解决.

  5. spark-shell启动spark报错

    前言 离线安装好CDH.Coudera Manager之后,通过Coudera Manager安装所有自带的应用,包括hdfs.hive.yarn.spark.hbase等应用,过程很是波折,此处就不 ...

  6. 接口访问报错:The valid characters are defined in RFC 7230 and RFC 3986

    写了个接口,在测试访问的时候,需要传json串,但是后台报错了 The valid characters are defined in RFC 7230 and RFC 3986 当前使用的tomca ...

  7. Theano 报错:No suitable SharedVariable constructor could be found. Are you sure all kwargs are supported? We do not support the parameter dtype or type

    当Theano报错:No suitable SharedVariable constructor could be found. Are you sure all kwargs are support ...

  8. Spark报错java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

    Spark 读取 JSON 文件时运行报错 java.io.IOException: Could not locate executable null\bin\winutils.exe in the ...

  9. 安装spark 报错:java.io.IOException: Could not locate executable E:\hadoop-2.7.7\bin\winutils.exe

    打开 cmd 输入 spark-shell 虽然可以正常出现 spark 的标志符,但是报错:java.io.IOException: Could not locate executable E:\h ...

随机推荐

  1. 从零开始ming的多人联机游戏--游戏客户端(1)六边形地图

    打算做的小游戏是一个多人联机的策略类游戏,类似于<文明>那种 游戏的玩法并不确定,开这个坑主要是为了入门后端开发,顺便熟悉下游戏开发 这篇文章使用unity,实现了六边形单元地图的创建.后 ...

  2. SpringMVC项目遇到406问题

    今天在写功能的时候,页面突然报出406错误,所有的静态资源都访问不到了 出现这样的原因是由于我Controller层的@RequestMapping没有加上地址,导致springmvc出错,修改过来页 ...

  3. python+selenium爬取百度文库不能下载的word文档

    有些时候我们需要用到百度文库的某些文章时,却发现需要会员才能下载,很难受,其实我们可以通过爬虫的方式来获取到我们所需要的文本. 工具:python3.7+selenium+任意一款编辑器 前期准备:可 ...

  4. Unreal Engine 4 蓝图完全学习教程(一)—— 简要介绍

    首先启动UE4: 新建项目类型为游戏: 选择空项目Blank: 项目设置选项: 点击创建项目: 打开后的窗口称为:“关卡编辑器”,由多个面板组成.在UE中,设计3D场景的空间称为“关卡”. 简单介绍一 ...

  5. 《 Java 编程思想》CH03 操作符

    < Java 编程思想>CH03 操作符 在最底层,Java中的数据是通过操作符来操作的. 操作符 +,-,*,*,=与其他语言类似 几乎所有的操作符只能操作"基本类似" ...

  6. 《Android Studio实战 快速、高效地构建Android应用》--四、Git入门

    Git版本控制系统(VCS)是分布式的,仓库的每一个副本均包含项目的完整历史 安装Git 下载 下载地址:http://git-scm.com/downloads 选择适合自己操作系统的来下载 如果下 ...

  7. MySQL初次安装配置及修改密码

    安装前的准备工作: 下载完后,我们将 zip 包解压到相应的目录,这里我将解压后的文件夹放在 C:\mysql-8.0.11 下. 接下来我们需要配置下 MySQL 的配置文件 打开刚刚解压的文件夹 ...

  8. JAVA环境配置(Windows10)

    Java开发环境配置 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:https://www.oracle.com/technetwork/java/javase/downloads/ ...

  9. linux命令之---ping

    1)命令简介 ping命令用来测试主机之间网络的连通性.执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常. 2)命令参数 ...

  10. 使用sass语法生成自己的css的样式库

    前言 先说一下 sass 和 scss的区别 sass 是一种缩进语法(即没有花括号和分号,只使用换行 缩进的方式去区别子元素,PS:这是我个人的理解) scss 是css-like语法  (它的语法 ...