vvl*_*rov 11 kryo apache-spark pyspark
请帮助理解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)
Run Code Online (Sandbox Code Playgroud)
在我将驱动程序内存增加到3Gb并将执行程序内存增加到4Gb并增加kryoserializer的缓冲区大小(我使用的是Spark 1.3)之后,会显示此异常
conf.set('spark.kryoserializer.buffer.mb', '256')
conf.set('spark.kryoserializer.buffer.max', '512')
Run Code Online (Sandbox Code Playgroud)
我想我已经将缓冲区设置得足够大,但是我的火花应用程序一直在崩溃.如何在执行程序上检查哪些对象正在使用Kryo缓冲区?有办法清理它吗?
在我的情况下,问题是使用错误的属性名称为最大缓冲区大小.
直到Spark版本1.3,属性名称是spark.kryoserializer.buffer.max.mb- 它最后有" .mb".但我使用Spark 1.4 docs中的属性名称- spark.kryoserializer.buffer.max.
因此,火花应用程序使用默认值 - 64mb.而且我处理的数据量还不够.
我修改了属性名称到spark.kryoserializer.buffer.max.mb我的应用程序工作正常.