2016-06-22 2 views
1

여러 개의 String 필드와 하나의 HashMap 필드를 가진 Java 클래스가 있습니다. 이 클래스의 객체를 기본 Kryo 직렬화로 직렬화하여 HBase에 저장하고 있습니다.Spry에서 HashMap의 Kryo deserialization이 실패합니다.

메모리에서 읽은 후 Spark에서 RDD의 flatMap 기능에서 역 직렬화하면 다음과 같은 오류가 발생합니다. 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)을 사용했습니다. 따라서 직렬화와 비 직렬화 버전이 일치해야합니다.