Искра: DecoderException: java.lang.OutOfMemoryError

Я запускаю потоковое приложение Spark в кластере с 3 рабочими узлами. Время от времени задания не выполняются из-за следующего исключения:

Job aborted due to stage failure: Task 0 in stage 4508517.0 failed 4 times, most recent failure: Lost task 0.3 in stage 4508517.0 (TID 1376191, 172.31.47.126): io.netty.handler.codec.DecoderException: java.lang.OutOfMemoryError
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:153)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:787)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:130)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.OutOfMemoryError
at sun.misc.Unsafe.allocateMemory(Native Method)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:127)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:306)
at io.netty.buffer.PoolArena$DirectArena.newUnpooledChunk(PoolArena.java:440)
at io.netty.buffer.PoolArena.allocateHuge(PoolArena.java:187)
at io.netty.buffer.PoolArena.allocate(PoolArena.java:165)
at io.netty.buffer.PoolArena.reallocate(PoolArena.java:277)
at io.netty.buffer.PooledByteBuf.capacity(PooledByteBuf.java:108)
at io.netty.buffer.AbstractByteBuf.ensureWritable(AbstractByteBuf.java:251)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:849)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:841)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:831)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:146)
... 10 more  

Я отправляю задание в клиентском режиме без каких-либо специальных параметров. И мастер, и рабочие имеют по 15 г памяти. Версия искры 1.4.0.

Решается ли это путем настройки конфигурации?


person user3646174    schedule 14.10.2015    source источник
comment
Стоит отметить, что мы используем много DStream.cache в нашем коде.   -  person user3646174    schedule 14.10.2015
comment
› Решается ли это путем настройки конфигурации? Вы уже должны были это попробовать, см. --executor-memory и --driver-memory. Не забудьте сбросить DStream, которые вам больше не нужны, с DStream.unpersist.   -  person mehmetminanc    schedule 14.10.2015


Ответы (1)


Я столкнулся с той же проблемой и обнаружил, что это, вероятно, вызвано утечкой памяти в netty версии 4.0.23.Final, которая используется Spark 1.4 (см. https://github.com/netty/netty)./issues/3837)

Это решено по крайней мере в Spark 1.5.0 (см. https://issues.apache.org/jira/browse/SPARK-8101), который использует netty 4.0.29.Final.

Поэтому обновление до последней версии Spark должно решить проблему. Буду пробовать в ближайшие дни.

Кроме того, Spark Jobserver в текущей версии принудительно использует netty 4.0.23.Final, поэтому его тоже нужно исправить.

РЕДАКТИРОВАТЬ: я обновился до Spark 1.6 с помощью netty 4.0.29.Final, но все еще получаю OOM с прямым буфером с помощью Spark Jobserver.

person lhaferkamp    schedule 12.01.2016
comment
Используя Spark 1.6.2, по-прежнему получаю эту ошибку, я уверен, что дело не в памяти исполнителя, но не знаю, как ее исправить. - person Thomas Decaux; 07.04.2017