Kryo序列化程序如何在Spark中分配缓冲区

时间:2015-08-11 16:37:02

标签: apache-spark pyspark kryo

请帮助理解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缓冲区? 有没有办法清理它?

6 个答案:

答案 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