请帮助了解Kryo串行器如何为其缓冲区分配内存。
当我的Spark应用程序尝试从工作人员向驱动程序收集大约122Mb的数据时,在收集步骤失败。
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)
当我将驱动程序内存增加到3Gb,将执行程序内存增加到4Gb,并且为kryoserializer增加了缓冲区大小后,就会显示此异常(我使用的是Spark 1.3)
conf.set('spark.kryoserializer.buffer.mb', '256')
conf.set('spark.kryoserializer.buffer.max', '512')
我认为我已经设置了足够大的缓冲区,但是我的spark应用程序一直崩溃。
如何检查执行程序上使用Kryo缓冲区的对象?
有办法清理吗?
最佳答案
就我而言,问题是最大缓冲区大小使用了错误的属性名称。
Up to Spark version 1.3属性名称为spark.kryoserializer.buffer.max.mb
-它的末尾有“ .mb
”。但是我使用了Spark 1.4 docs-spark.kryoserializer.buffer.max
的属性名称。
结果,spark应用程序使用的是默认值-64mb。而且这还不足以处理我正在处理的数据量。
将属性名称固定为spark.kryoserializer.buffer.max.mb
后,我的应用程序运行正常。
关于apache-spark - Kryo序列化器如何在Spark中分配缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31947335/