我想在火花流中使用Kryo串行器。我在Spark tuning docs閱讀 -
最後,如果您沒有註冊您的自定義類,KRYO仍將 工作,但它必須完整的類名存儲與每個對象, 這是一種浪費。
所以我想要註冊所有的類。我的情況下,類 -
trait Message extends java.io.Serializable
object MutableTypes {
type Childs = scala.collection.mutable.Map[Int, (Long, Boolean)]
type Parents = scala.collection.mutable.Map[Int, Childs]
}
case class IncomingRecord(id_1: String, id_raw: String, parents_to_add: MutableTypes.Parents, parents_to_delete: MutableTypes.Parents) extends Message
,我註冊類這樣的 -
sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.set("spark.kryo.registrationRequired","true")
sparkConf.registerKryoClasses(Array(classOf[Tuple2[Long,Boolean]],classOf[IncomingRecord]))
我得到這個異常:
com.esotericsoftware.kryo.KryoException: 的java.lang .IllegalArgumentException:類未註冊: scala.Tuple2 $ mcJZ $ sp注意:要註冊此類,請使用: kryo.register(scala.Tuple2 $ mcJZ $ sp.class);序列化跟蹤:在 com.esotericsoftware.kryo.serializers.FieldSerializer $ ObjectField.write(FieldSerializer.java:585) 在 com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer parents_to_add(com.test.IncomingRecord)的.java:213) 在com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
在 org.apache.spark.serializer.KryoSerializationStream.writeObject(KryoSerializer.scala:194) 在 有機apache.spark.serializer.SerializationStream.writeValue(Serializer.scala:147) at org.apache.spark.storage.DiskBlockObjectWriter.write(DiskBlockObjectWriter.scala:185) 在 org.apache.spark.util.collection.WritablePartitionedPairCollection $$不久$ 1.writeNext(WritablePartitionedPairCollection.scala:56) 在 org.apache.spark.util.collection.ExternalSorter.writePartitionedFile(ExternalSorter.scala:659) 在 org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:72) 在 org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73) 在 org.apache。 spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41) at org.apache.spark.scheduler.Task.run(Task.scala:89)at org.apache.spark.executor.Executor $ TaskRunner.run( Executor.scala:214) at(ThreadPoolExecutor.java:617) java.lang.Thread.run(Thread。) java:745)
我該如何註冊我的課程?如何解決這個問題?
更新:
我知道轉彎registeration false將刪除異常,但不會因爲額外的開銷,許多性能增加。我想知道如何註冊我的課程。
不知道'classOf [Tuple2 [長,布爾]'選擇專業類。你沒有得到這個表情的警告嗎?也許你可以在沒有專業化的情況下用'case class'替換它。 –
我沒有得到任何警告 –