2015-08-11 42 views
6

Proszę, pomóż zrozumieć, w jaki sposób serializator Kryo przydziela pamięć dla swojego bufora.Jak serializator Kryo przydziela bufor w Spark

Moja aplikacja Spark kończy się niepowodzeniem na etapie zbierania danych, gdy próbuje zebrać około 122 MB danych do sterownika od pracowników.

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) 

Ten wyjątek jest pokazany po tym jak wzrosła pamięci sterownika do 3Gb i pamięci executora do 4GB oraz zwiększenie rozmiaru bufora dla kryoserializer (używam Spark 1.3)

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

myślę "Ustawiłem bufor na wystarczająco duży, ale moja iskra ciągle się zawiesza. Jak mogę sprawdzić, jakie obiekty używają bufora Kryo na executorze? Czy można to wyczyścić?

+0

Wygląda na to, że Spark 1.3 nie ma własności 'spark.kryoserializer.buffer.max' - ma' spark.kryoserializer.buffer.max.mb'. Testuję teraz aplikację z poprawnym zestawem właściwości. – vvladymyrov

+0

Mam podobny problem, czy możesz go rozwiązać? Jeśli tak to jak? –

+0

@AlbertoBonsanto czy moja odpowiedź pomogła Ci w rozwiązaniu problemu? – vvladymyrov

Odpowiedz

5

W moim przypadku problem polegał na użyciu niewłaściwej nazwy właściwości dla maksymalnego rozmiaru bufora.

Up to Spark version 1.3 nazwa nieruchomości to spark.kryoserializer.buffer.max.mb - ma ona ".mb" na końcu. Ale użyłem nazwy właściwości od Spark 1.4 docs - spark.kryoserializer.buffer.max.

W rezultacie aplikacja iskry używała wartości domyślnej - 64 MB. I to nie wystarczyło do ilości przetwarzanych danych.

Po ustaleniu nazwy nieruchomości na spark.kryoserializer.buffer.max.mb moja aplikacja działała poprawnie.

0

Używam iskry 1.5.2 i miałem ten sam problem. Ustawienie spark.kryoserializer.buffer.max.mb na 256 poprawiło to.

1

Zastosowanie conf.set('spark.kryoserializer.buffer.max.mb', 'val') ustawić bufor kryoserializer i pamiętać val powinna być mniejsza niż 2048 inaczej dostaniesz jakiś błąd ponownie wskazujący bufora powinna być mniejsza niż 2048 MB

1

Rozwiązanie jest ustawienie spark.kryoserializer.buffer.max do 1g w spark-default.conf i ponowne iskry usługi

To przynajmniej dla mnie zadziałało.