请帮助理解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')
我认为我已经将缓冲区设置得足够大,但我的火花应用程序仍在崩溃。 如何在执行程序上检查哪些对象正在使用Kryo缓冲区? 有没有办法清理它?
答案 0 :(得分:7)
就我而言,问题是使用了错误的属性名称作为最大缓冲区大小。
Up to Spark version 1.3属性名称为spark.kryoserializer.buffer.max.mb
- 它有" .mb
"到底。但是我使用了来自Spark 1.4 docs - spark.kryoserializer.buffer.max
的属性名称。
因此,火花应用程序使用默认值 - 64mb。这对我正在处理的数据量来说还不够。
我将属性名称修改为spark.kryoserializer.buffer.max.mb
后,我的应用运行正常。
答案 1 :(得分:2)
使用conf.set('spark.kryoserializer.buffer.max.mb', 'val')
设置kryoserializer
缓冲区,请记住val
应小于2048,否则会再次出现错误,表明缓冲区应小于2048MB
答案 2 :(得分:2)
解决方案是在spark.kryoserializer.buffer.max
中将1g
设置为spark-default.conf
并重新启动spark服务
这至少对我有用。
答案 3 :(得分:1)
我正在使用spark 1.5.2并且我遇到了同样的问题。将spark.kryoserializer.buffer.max.mb
设置为256可以修复它。
答案 4 :(得分:1)
现在不推荐使用spark.kryoserializer.buffer.max.mb
WARN spark.SparkConf:配置密钥 从Spark开始不推荐使用'spark.kryoserializer.buffer.max.mb' 1.4和,将来可能会删除。请改用新的密钥“ spark.kryoserializer.buffer.max”。
您应该使用:
import org.apache.spark.SparkConf
val conf = new SparkConf()
conf.set("spark.kryoserializer.buffer.max", "val")
答案 5 :(得分:0)
这个问题很旧,但对于Spark(版本2.4.0),如果您要更改'spark.kryoserializer.buffer.max'属性,请转到
/etc/spark/conf/spark-defaults.conf
并添加/更改
spark.kryoserializer.buffer.max =“ 您想要的值”。
参考:Eli's Blog