2015-08-11 11 views
6

Bitte helfen zu verstehen, wie Kryo Serializer Speicher für seinen Puffer reserviert.Wie Kryo Serializer Puffer in Spark zuweist

Meine Spark-App schlägt bei einem Collect-Schritt fehl, wenn sie versucht, von Mitarbeitern 122 MB Daten an einen Treiber zu sammeln.

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) 

Diese Ausnahme gezeigt, nachdem ich den Treiber Speicher zu 3Gb und Testamentsvollstrecker Speicher auf 4 GB und eine erhöhte Puffergröße für kryoserializer erhöht haben

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

Ich glaube (ich Spark-1.3 verwenden) I habe Puffer so eingestellt, dass er groß genug ist, aber meine Spark-App stürzt immer weiter ab. Wie kann ich überprüfen, welche Objekte Kryo-Puffer auf einem Executor verwenden? Gibt es eine Möglichkeit, es aufzuräumen?

+0

Sieht aus wie das Problem ist, dass Spark 1.3 hat keine Eigenschaft 'spark.kryoserializer.buffer.max' - es hat' spark.kryoserializer.buffer.max.mb'. Ich teste die App jetzt mit dem richtigen Eigenschaftensatz. – vvladymyrov

+0

Ich habe ein ähnliches Problem, könnten Sie es lösen? Wenn das so ist, wie? –

+0

@AlbertoBonsanto hat meine Antwort Ihnen bei Ihrem Problem geholfen? – vvladymyrov

Antwort

5

In meinem Fall verwendete das Problem den falschen Eigenschaftsnamen für die maximale Puffergröße.

Up to Spark version 1.3 der Name der Eigenschaft ist spark.kryoserializer.buffer.max.mb - es hat ".mb" am Ende. Aber ich verwendete den Namen der Eigenschaft von Spark 1.4 docs - spark.kryoserializer.buffer.max.

Als Ergebnis Funken App verwendet den Standardwert - 64 MB. Und es war nicht genug für die Menge der Daten, die ich verarbeitet habe.

Nachdem ich den Eigenschaftsnamen auf spark.kryoserializer.buffer.max.mb festgelegt hatte, funktionierte meine App gut.

0

Ich benutze Funke 1.5.2 und ich hatte das gleiche Problem. Einstellung spark.kryoserializer.buffer.max.mb auf 256 behoben.

1

Verwenden conf.set('spark.kryoserializer.buffer.max.mb', 'val')kryoserializer Puffer zu setzen und im Auge behalten val sollte als 2048 weniger sein sonst hat man wieder einige Fehler bekommen Puffer angibt, sollte weniger als 2048MB

1

Lösung zur Einrichtung ist spark.kryoserializer.buffer.max-1g in spark-default.conf und Neustarten Funken Dienstleistungen

Dies zumindest für mich gearbeitet.

Verwandte Themen