解决"Kryo serialization failed: Buffer overflow" Spark 异常



我正在尝试运行Spark(Java)代码并收到错误

org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow. Available: 0, required: 27".

其他帖子建议将缓冲区设置为其最大值。当我尝试使用最大缓冲区值为 512MB 时,我收到错误

java.lang.ClassNotFoundException: org.apache.spark.serializer.KryoSerializer.buffer.max', '512'

如何解决这个问题?

属性名称是正确的,spark.kryoserializer.buffer.max ,该值应包括单位,因此在您的情况下为 512m。

此外,根据您设置配置的位置,您可能必须编写--conf spark.kryoserializer.buffer.max=512m 。例如,使用spark-submit或在 Oozie worflow 操作的<spark-opts>...</spark-opts>内。

尝试使用 " spark.kryoserializer.buffer.max.mb"、"512 " 代替 spark.kryoserializer.buffer.max "、"512MB"

这是一个古老的问题,但当我用谷歌搜索时,第一个命中,所以在这里回答以帮助他人。

对于Spark 3.2(在Azure Synapse环境中,但不确定这是否重要),我尝试了所有这些组合,但唯一可以将大型Spark DataFrame转换为Pandas()的组合是spark.kryoserializer.buffer.max=512。数字后没有字母,末尾没有".mb"。

您可以在

创建 Spark 会话时在 Spark 配置中将其设置为

SparkSession.builder
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.config("spark.kryoserializer.buffer.max", "512m")

或者你可以将你的 Spark 提交命令作为

spark-submit 
--verbose 
--name "JOB_NAME" 
--master MASTER_IP 
--conf "spark.kryoserializer.buffer.max=512m" 
main.py 

最新更新