apache-spark - Kryo序列化器如何在Spark中分配缓冲区

标签 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')


我认为我已经设置了足够大的缓冲区,但是我的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/

相关文章:

apache-spark - Spark : How to time range join two lists in memory?

python - 使用 pyspark 时 PyCharm 中的 DataFrame View

java - Flink 1.4 AvroUtils 报错

java - Kryo 无法序列化 java.sql.Timestamp?

apache-spark - 为什么我必须明确告诉 Spark 缓存什么?

r - 找出 2 个表 (`tbl_spark` ) 是否相等而不使用 sparklyr 收集它们

java - Spark on HBase 异常类未找到(JAVA)

apache-spark - 如何使用DataFrame和JDBC连接为缓慢的Spark作业提高性能?

apache-spark - 在 pyspark 数据框中平面映射一个 collect_set

scala - 如何使用 Kryo 反序列化不可变集合?