java - Spark 中 HashMap 的 Kryo 反序列化失败

标签 java serialization apache-spark deserialization kryo

我有一个 Java 类,它有几个 String 字段和一个 HashMap 字段。我使用默认的 Kryo 序列化来序列化此类的对象并将它们存储在 HBase 中。

将它们读取到内存中后,在 Spark 中 RDD 的 flatMap 函数中进行反序列化会产生以下错误。尽管相同的代码段在不涉及 Spark 的情况下也可以工作。

    16/06/22 11:13:05 WARN TaskSetManager: Lost task 20.0 in stage 3.0 (TID 85, localhost): com.esotericsoftware.kryo.KryoException: Unable to find class: Dadaisme
    at com.esotericsoftware.kryo.util.DefaultClassResolver.readName(DefaultClassResolver.java:138)
    at com.esotericsoftware.kryo.util.DefaultClassResolver.readClass(DefaultClassResolver.java:115)
    at com.esotericsoftware.kryo.Kryo.readClass(Kryo.java:610)
    at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:721)
    at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:126)
    at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:17)
    at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:729)
    at prSpark.EmPageRank$1.call(EmPageRank.java:227)
    at prSpark.EmPageRank$1.call(EmPageRank.java:1)
    at org.apache.spark.api.java.JavaRDDLike$$anonfun$fn$3$1.apply(JavaRDDLike.scala:149)
    at org.apache.spark.api.java.JavaRDDLike$$anonfun$fn$3$1.apply(JavaRDDLike.scala:149)
    at scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371)
    at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1595)
    at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
    at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
    at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
    at org.apache.spark.scheduler.Task.run(Task.scala:89)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: Dadaisme
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:340)
    at com.esotericsoftware.kryo.util.DefaultClassResolver.readName(DefaultClassResolver.java:136)
    ... 22 more

来自堆栈跟踪 com.esotericsoftware.kryo.KryoException: Unable to find class: Dadaisme 它表示找不到“Dadisme”类,但“Dadisme”不是我的程序中的任何类,它是HashMap字段中的数据。

最佳答案

出现此异常的原因是用于序列化和反序列化的 Kyro 库版本不同。 Spark 默认使用 Kryo 版本 2,我使用最新版本(即 3.x)的 Kryo 来序列化对象。因此序列化和反序列化版本应该匹配。

关于java - Spark 中 HashMap 的 Kryo 反序列化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37964597/

相关文章:

java - 当应用程序被终止时,在 LinearLayout 中安全地动态创建 View

c# - 使用 C# 使用 web 服务 php

scala - 使用 Spark 分析推特数据

apache-spark - pyspark:StopWordsRemover 参数区域设置给定的值无效

apache-spark - 使用spark删除hbase单元

java - RepositoryItemReader 找不到带参数的方法

java - 安卓Java : Get Response Body from HttpUrlConnection

jquery - 如何访问 jQuery 序列化数据?

python - 为什么覆盖 resetful JSONWebTokenSerializer 只保持返回 token ? Python

java - 如何在 JdbcBatchItemWriter 中使用自动生成的 ID?