2016-12-30 79 views
2

我想在火花流中使用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將刪除異常,但不會因爲額外的開銷,許多性能增加。我想知道如何註冊我的課程。

+0

不知道'classOf [Tuple2 [長,布爾]'選擇專業類。你沒有得到這個表情的警告嗎?也許你可以在沒有專業化的情況下用'case class'替換它。 –

+0

我沒有得到任何警告 –

回答

0

最後,如果您沒有註冊您的自定義類,KRYO仍將 工作,但它必須完整的類名存儲與每個對象, 這是一種浪費。 此使用默認值spark.kryo.registrationRequired只有當真正的」(這是假的)

下面要解決的問題異常(或避免設置此參數的任何值,並使用默認值,即假)

.set("spark.kryo.registrationRequired","false") 

更多信息可以在這裏找到:http://spark.apache.org/docs/latest/configuration.html

spark.kryo.registrationRequired false(默認值)是否需要登記KRYO 如果設置爲 '真',KR。如果一個未註冊的類被序列化,你將會拋出異常。如果設置爲false(缺省值),Kryo將會寫入未註冊的類名和每個對象。編寫類名可能會導致顯着的性能開銷,因此啓用此選項可嚴格執行用戶未從註冊中省略類。

幾點 - 如何註冊KRYO系列化:

+0

我想提高表現,所以想要註冊我所有的課程。 –

+0

@NishantKumar - 將標誌設置爲「false」將刪除異常,我添加了幾個可能有助於kyro序列化的鏈接。 – Yaron

+0

我在帖子中添加了Spark流媒體網站的報價。我知道這個錯誤會消除這個異常,但根據官方文件這將是浪費,並且由於開銷而不會提高性能。我想知道我怎麼能註冊我所有的課程。 –