2016-06-22 17 views
1

私は、いくつかのStringフィールドと1つのHashMapフィールドを持つJavaクラスを持っています。私はこのクラスのオブジェクトをデフォルトのKryoシリアル化でシリアル化し、HBaseに格納しています。SparkでHashMapのKryo逆シリアル化が失敗する

メモリ内でそれらを読み取った後、SparkのRDDの機能でデシリアライズすると、次のエラーが発生します。同じコードセグメントがSparkに関係していない場合でも動作します。ここでは、スタックトレースcom.esotericsoftware.kryo.KryoException: Unable to find class: Dadaismeそれが言うから

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 

が「Dadisme」クラスが見つからなかったが、「Dadismeは」私のプログラムのいずれかのクラスではありません、それはHashMapのフィールド内のデータがあります。

+0

私も同様の問題に直面しました。私の場合、HashMapは400Kを超える大きなエントリでした。これは大きなコレクションを扱う際のkryoのバグが原因だと思います。後で、私はユースケースのためにジャクソンに切り替えました。 – bistaumanga

+0

私の場合、HashMapのサイズが約1000であるため、問題は発生していないと思います。 – dnivog

答えて

1

この例外は、シリアル化とデシリアライズに使用されるKyroライブラリのバージョンの違いが原因で発生しました。 SparkはデフォルトでKryoのバージョン2を使用しています。オブジェクトのシリアル化にはKryoの最新バージョン(つまり3.x)を使用しました。したがって、シリアライゼーションとデシリアライゼーションのバージョンが一致する必要があります。

関連する問題