2016-12-30 30 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流媒体网站的报价。我知道这个错误会消除这个异常,但根据官方文件这将是浪费,并且由于开销而不会提高性能。我想知道我怎么能注册我所有的课程。 –