ho Kryo serializzazione accesa con questo:Richiede Kryo serializzazione a Spark (Scala)
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
voglio garantire che una classe personalizzata viene serializzato utilizzando Kryo quando mescolate tra i nodi. Posso registrare la classe con Kryo questo modo:
conf.registerKryoClasses(Array(classOf[Foo]))
Da quanto ho capito, questo non garantisce che in realtà la serializzazione Kyro viene utilizzato; se un serializzatore non è disponibile, kryo tornerà alla serializzazione Java.
Per garantire che Kryo serializzazione accade, ho seguito questa raccomandazione dalla documentazione Spark:
conf.set("spark.kryo.registrationRequired", "true")
Ma questo fa sì che IllegalArugmentException da buttare ("classe non è registrata") per un gruppo di classi diverse, che mi assumere Spark utilizza internamente, ad esempio i seguenti:
org.apache.spark.util.collection.CompactBuffer
scala.Tuple3
Sicuramente non devo registrare manualmente ciascuna di queste singole classi con Kryo? Questi serializzatori sono tutti definiti in kryo, quindi esiste un modo per registrarli automaticamente?
Stavo usando SparkConf.registerKryoClasses, che ero certo di aver trovato nella documentazione da qualche parte, ma non sono in grado di trovare ora. Userò l'impostazione spark.kryo.classesToRegister. – pheaver
@Daniel Darabos: La mia classe di modello ha solo getter e setter che voglio registrare usando kryo, ho bisogno di registrare i tipi di dati che sono usati all'interno della classe del modello ... ad esempio il tipo di stringa. – Shankar
'String' è registrato di default, come lo sono tutte le classi primitive come' Long'. Ma in generale è necessario registrare tutto ciò che è contenuto nella classe che si desidera serializzare. Non è necessario pensare troppo: se non hai registrato qualcosa, riceverai un messaggio di errore se hai abilitato 'spark.kryo.registrationRequired'. –