当前位置: 首页 > 知识库问答 >
问题:

avro对象不能序列化为Map-Spark的值

方永贞
2023-03-14

我正面临一种奇怪的行为。

Spark不能在Map[String, AvroObj]中序列化avro对象,即使我使用了avro-1.8.0,它使avro对象可序列化。

Exception in thread "main" org.apache.spark.SparkException: Task not serializable    
Caused by: java.io.NotSerializableException: my.avro.Object
    Serialization stack:
        - object not serializable (class: my.avro.Object, value: {"A": "B", ...})
        - writeObject data (class: scala.collection.mutable.HashMap)
        - object (class scala.collection.mutable.HashMap

我怀疑SCHEMA$属性仍然不可序列化,但当我在闭包中单独使用AvroObj时,一切都很好。此外,我也毫无问题地广播了我的Map[String,AvroObj]。同样,我的avro对象只包含String和long。

然后,为了实现这一点,我必须从我的avro对象重建一个扩展为serializable的新对象,然后我的新映射[String,MySerializableObject]就没有问题了。。。但我失去了从avsc生成classe的可用性,它增加了很多代码。

请注意,我使用的是Kryoregistor、spark-1.5.0、avro-1.8.0和scala 2.10。

我试图将地图设置为不可变的,甚至是这里描述的地图(身份)https://issues.scala-lang.org/browse/SI-7005

有没有办法绕过这个问题而不必重新定义新对象?或者我可能错过了什么?

非常感谢你,塞巴斯蒂安

共有1个答案

爱博达
2023-03-14

此问题与Avro模式编译器低于1.8的任何版本有关。Avro生成Java类时没有实现Serializable接口,因此,当它试图序列化这些Java对象时,会在Spark处导致NotSerializableExctive。该问题已在Avro 1.8.0中解决(2016年1月22日)

AVRO-1502. Java: Generated classes now implement Serializable.
Generated classes need to be regenerated to use this release. 
 类似资料:
  • 我使用avro工具从avsc文件生成java类,使用: 然后,我试图通过ObjectMapper将这些对象序列化为json,但总是得到一个JsonMappingException,上面写着“不是枚举”或“不是联合”。在我的测试中,我使用其生成器或构造函数创建生成的对象。我对不同类的对象有这样的例外。。。 示例代码: 我还使用:serializer尝试了许多配置。配置(…)但还是失败了。版本:Jav

  • 我该怎么做才能使这件事如我所愿?。谢谢 JSON对象示例列表 示例JSON对象: null 忽略不存在json字段的反序列化错误,但问题仍然存在。 示例:对象反序列化器

  • 我正在试验Stanford CoreNLP库,我想序列化主要的StanfordCoreNLP管道对象,尽管它抛出了一个java.io.NotSerializableException。 完整故事:每当我运行我的实现时,将管道注释器和分类器加载到内存中大约需要15秒。最终进程的内存约为600MB(很容易小到可以存储在我的机箱中)。我想在第一次创建管道后保存它,这样我就可以在以后将其读入内存。 然而,

  • 问题内容: 如何在JavaScript中将对象序列化为JSON? 问题答案: 您正在寻找。

  • 当我运行Spark Scala程序时,有一个“Task not serializable”异常 Spark RDD是不可串行化类型(java类) 调用的函数来自不可序列化的类(java类,再次) 我的代码是这样的 我注意到我可以用 但对于RDD中的对象类,我仍然会遇到这个例外。我会以另一种方式,也会以另一种方式,也就是第二部分,因为我不想创建大量PredicateClass的对象。 你能帮我吗?我

  • 我正在尝试准备一个库(用Java编写)来运行在Apache-Spark上。由于该库有数百个类,并且仍处于活跃的开发阶段,所以我不想一一序列化所有的类。相反,我搜索了另一个方法,并找到了这个方法,但它同样不能解决序列化问题。 下面是代码示例: 这会产生年份4d的“对象不可序列化”异常: 顺便说一下,如果我将命令Action collect()替换为foreach(func), 那么,我的问题是为什么