2015-08-11 15 views
6

Si prega di aiutare a capire come serializzatore Kryo alloca la memoria per il suo buffer.Come serializzatore Kryo alloca il buffer in Spark

L'app My Spark non riesce in una fase di raccolta quando tenta di raccogliere circa 122 MB di dati a un driver dai lavoratori.

com.esotericsoftware.kryo.KryoException: Buffer overflow. Available: 0, required: 57197 
    at com.esotericsoftware.kryo.io.Output.require(Output.java:138) 
    at com.esotericsoftware.kryo.io.Output.writeBytes(Output.java:220) 
    at com.esotericsoftware.kryo.io.Output.writeBytes(Output.java:206) 
    at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ByteArraySerializer.write(DefaultArraySerializers.java:29) 
    at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ByteArraySerializer.write(DefaultArraySerializers.java:18) 
    at com.esotericsoftware.kryo.Kryo.writeObjectOrNull(Kryo.java:549) 
    at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:312) 
    at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:293) 
    at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568) 
    at org.apache.spark.serializer.KryoSerializerInstance.serialize(KryoSerializer.scala:161) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213) 

Questa eccezione viene visualizzato dopo ho aumentato la memoria del driver a 3 Gb di memoria e l'esecutore a 4Gb e aumentato la dimensione del buffer per kryoserializer (sto usando Spark 1,3)

conf.set('spark.kryoserializer.buffer.mb', '256') 
conf.set('spark.kryoserializer.buffer.max', '512') 

Credo ho impostato il buffer per essere abbastanza grande, ma la mia app scintilla continua a bloccarsi. Come posso verificare quali oggetti stanno usando il buffer Kryo su un executor? C'è un modo per ripulirlo?

+0

Sembra che il problema sia che Spark 1.3 non ha la proprietà 'spark.kryoserializer.buffer.max' - ha' spark.kryoserializer.buffer.max.mb'. Sto testando l'app ora con il set di proprietà corretto. – vvladymyrov

+0

Ho un problema simile, potresti risolverlo? se é cosi, come? –

+0

@AlbertoBonsanto la mia risposta ti ha aiutato con il tuo problema? – vvladymyrov

risposta

5

Nel mio caso, il problema era l'utilizzo del nome di proprietà errato per la dimensione massima del buffer.

Up to Spark version 1.3 il nome della proprietà è spark.kryoserializer.buffer.max.mb - ha ".mb" alla fine. Ma ho usato il nome della proprietà da Spark 1.4 docs - spark.kryoserializer.buffer.max.

Come risultato, l'applicazione spark utilizzava il valore predefinito: 64 MB. E non era abbastanza per la quantità di dati che stavo elaborando.

Dopo aver corretto il nome della proprietà su spark.kryoserializer.buffer.max.mb, la mia app ha funzionato correttamente.

0

Sto usando la scintilla 1.5.2 e ho avuto lo stesso problema. L'impostazione di spark.kryoserializer.buffer.max.mb su 256 lo ha risolto.

1

Usa conf.set('spark.kryoserializer.buffer.max.mb', 'val') per impostare kryoserializer buffer e tenere a mente val deve essere inferiore a 2048 altrimenti si otterrà qualche errore di nuovo l'indicazione di buffer deve essere inferiore a 2048MB

1

soluzione è di impostare spark.kryoserializer.buffer.max-1g in spark-default.conf e scintilla riavvio servizi

Questo almeno ha funzionato per me.

Problemi correlati