【问题标题】:How to overcome the Spark spark.kryoserializer.buffer.max 2g limit?如何克服 Spark spark.kryoserializer.buffer.max 2g 限制?
【发布时间】:2019-08-23 16:58:18
【问题描述】:

我正在使用 spark 2.4.2 读取包含 600 条记录的 csv。最后 100 条记录包含大量数据。 我遇到了问题,

ERROR Job aborted due to stage failure: 
Task 1 in stage 0.0 failed 4 times, most recent failure: 
Lost task 1.3 in stage 0.0 (TID 5, 10.244.5.133, executor 3): 
org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow. Available: 0, required: 47094. 
To avoid this, increase spark.kryoserializer.buffer.max value.

我已将spark.kryoserializer.buffer.max 增加到 2g(允许的最大设置)并将 spark 驱动程序内存增加到 1g,并且能够处理更多记录,但仍然无法处理 csv 中的所有记录。

我已尝试对 600 条记录进行分页。例如,使用 6 个分区,每个分区可以处理 100 条记录,但由于最后 100 条记录很大,因此会发生缓冲区溢出。

在这种情况下,最后 100 条记录很大,但这可能是前 100 条或 300 到 400 条之间的记录。除非我事先对数据进行采样以了解偏差,否则我无法优化处理方法。

spark.kryoserializer.buffer.max不允许超过2g有什么原因吗?

我可以增加分区并减少每个分区读取的记录吗?是否可以使用压缩?

欣赏任何想法。

【问题讨论】:

  • 你能显示代码吗?

标签: apache-spark


【解决方案1】:

Kryo 缓冲区由字节数组支持,原始数组只能是 最大 2GB。

请参阅以下链接了解更多详情。 https://github.com/apache/spark/commit/49d2ec63eccec8a3a78b15b583c36f84310fc6f0

由于无法优化处理方法,请增加分区数。

【讨论】:

    【解决方案2】:

    在那些记录中,你有什么单曲会破坏 kryo 缓冲区的。 通常,将分区保留为默认 200 应该始终是一个好的起点。不要将其减少到 6。

    看起来单条记录(行)超出了限制。 您可以尝试使用多种读取 csv 数据的选项csv options 如果有一行转化为 2GB 缓冲区溢出,我会考虑以不同的方式解析文件。 如果您give it a schema,csv 阅读器也会忽略/跳过文件中的一些文本(无序列化)。 如果您从架构中删除一些如此庞大的列,它可能会轻松读取数据。

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 2010-10-13
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      相关资源
      最近更新 更多