我已将 Kryo Serializer 设置为 SparkConf 中的默认序列化程序,Spark UI 也确认了这一点,但在 Spark 日志中,我收到了此异常,

java.io.OptionalDataException
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1370)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at scala.collection.immutable.$colon$colon.readObject(List.scala:366)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1893)
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.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.readObject(ObjectInputStream.java:370)
at org.apache.spark.scheduler.DirectTaskResult$$anonfun$readExternal$1.apply$mcV$sp(TaskResult.scala:74)
at org.apache.spark.util.Utils$.tryOrIOException(Utils.scala:993)
at org.apache.spark.scheduler.DirectTaskResult.readExternal(TaskResult.scala:58)
at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1837)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:62)
at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:81)
at org.apache.spark.scheduler.TaskResultGetter$$anon$2$$anonfun$run$1.apply$mcV$sp(TaskResultGetter.scala:50)
at org.apache.spark.scheduler.TaskResultGetter$$anon$2$$anonfun$run$1.apply(TaskResultGetter.scala:49)
at org.apache.spark.scheduler.TaskResultGetter$$anon$2$$anonfun$run$1.apply(TaskResultGetter.scala:49)
at org.apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1468)
at org.apache.spark.scheduler.TaskResultGetter$$anon$2.run(TaskResultGetter.scala:48)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

这里我有两个问题:

1- 为什么仍然使用 java 序列化程序?
2- 如何解决 java.io.OptionalDataException

我根据this知道java.io.OptionalDataException的原因,但无法解决。

这是我的课:

    class GeometryWritable(var geometry: Geometry) extends Writable with Externalizable with KryoSerializable {

       def this() = this(null)

       override def write(dataOutput: DataOutput) {
          val bytes = GeometryEngine.geometryToEsriShape(geometry)
          dataOutput.writeInt(bytes.length);
          dataOutput.write(bytes);
      }
      override def readFields(dataInput: DataInput) {
          val bytesArray: Array[Byte] = new Array[Byte](dataInput.readInt())
          dataInput.readFully(bytesArray)
          geometry = GeometryEngine.geometryFromEsriShape(bytesArray, Geometry.Type.Unknown);
      }
      /**
       * override writeExternal (as class is extends by Writable interface)
       *
       * @param dataOutPut, Data Output Stream where data has to pushed
       * @return Unit
       */
      @throws(classOf[IOException])
      override def writeExternal(dataOutput: ObjectOutput) {
         val bytes = GeometryEngine.geometryToEsriShape(geometry)
         dataOutput.writeInt(bytes.length);
         dataOutput.write(bytes);
      }
      /**
       * override readFields (as class is extends by Writable interface)
       *
       * @param dataInput, Data Input Stream from where data has to read
       * @return Unit
       */
       @throws(classOf[IOException])
       @throws(classOf[ClassNotFoundException])
       override def readExternal(dataInput: ObjectInput) {
           val bytesArray: Array[Byte] = new Array[Byte](dataInput.readInt())
           dataInput.readFully(bytesArray)
           geometry = GeometryEngine.geometryFromEsriShape(bytesArray, Geometry.Type.Unknown)
       }
       def write(kryo: Kryo, output: Output) {
           val bytes = GeometryEngine.geometryToEsriShape(geometry)
           output.writeInt(bytes.length);
           output.write(bytes);
       }

       def read(kryo: Kryo, input: Input) {
          val bytesArray: Array[Byte] = new Array[Byte](input.readInt())
          input.read(bytesArray, 0, bytesArray.length)
          geometry = GeometryEngine.geometryFromEsriShape(bytesArray, Geometry.Type.Unknown)
       }
    }

  ask by Zia Kiyani translate from so

本文未有回复,本站智能推荐:

2回复

Kryo序列化程序在底层Scala类WrappedArray上导致异常

两个问题,一般问题的答案将指导我如何最小化MVCE。 1)我怎么知道预先注册WrappedArray,(以及我可能使用的Scala中的其他所有类)? 必须使用Kryo从库中注册类是否正常? 具体: 2)我该如何解决这个问题? (如果在这里反映一个错误的错误,我愿意承认我可能还有别
1回复

Spark-使用不可序列化的成员序列化对象

我将在Spark上下文中提出这个问题,因为这就是我要面对的问题,但这可能是一个普通的Java问题。 在我们的Spark工作中,我们有一个Resolver ,需要在所有工作人员中使用它(在udf中使用)。 问题在于它不可序列化,我们无法将其更改为可序列化。 解决方案是将其作为可序列化的另一
1回复

在spark-shell和Scalajars中使用Kryo注册复杂的Scala类

我有一个新的 spark 2.3.1 应用程序......它运行了一段时间,但现在随着数据量的增加它坏了。 原始错误是 kryo 序列化问题... com.esotericsoftware.kryo.KryoException: java.lang.NegativeArraySizeExceptio
1回复

Spark中的Kryo与编码器与Java序列化?

哪种序列化用于哪种情况, 从火花文档它说: 它提供了两个序列化库: 1. Java(默认)和 2. 克里奥现在编码器从何而来,为什么没有在文档中给出。 而且从 databricks 中可以看出,编码器对于数据集的执行速度更快,RDD 怎么样,以及如何将所有这些映射结合在一起。 在哪种情况下我们应该
1回复

Kryo序列化空反序列化

我将代码重构为可用于kryo序列化。 除了反序列化某些类的geomtry属性外,一切都正常。 没有引发异常(我将“ spark.kryo.registrationRequired”设置为true)。 在调试时,我尝试收集数据,并且我发现几何体中的数据只是空的。 结果,我知道反序列化失败。
1回复

Spark/Java:不可序列化问题-Kryo序列化

我对kryo序列化缺少什么? Class1和Class3不是Java可序列化的类(没有默认构造函数,没有getter和setter) 当我尝试“使用”实例时,该实例是在Spark内部通过Spark上下文创建的,无论是否将Classe3注册为Kryo类,都会遇到序列化问题。 工作正常:
1回复

即使在conf中注册了类,Kryo序列化也没有注册

我创建了一个Person类并进行了注册,但在运行时它显示未注册的类。 这是示例代码:
1回复

Kryo:反序列化旧版本的类

我需要通过添加两个新参数来修改类。 这个类是用Kryo序列化的。 每当我停止我的流时,我目前正在持续保存与此课程相关的信息,作为RDD。 当我重新启动流时,我加载了以前持久化的信息,并使用它们在我停止和重新启动之间保持一致。 由于I类持久化需要这些新参数,我通过添加新的kryo.wri