如何克服Spark spark.kryoserializer.buffer.max 2g的限制?

时间:2019-08-23 16:58:18

标签: apache-spark

我正在使用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(最大允许设置),并将火花驱动程序的内存增加到了1g,能够处理更多的记录,但仍然无法处理csv中的所有记录。

我尝试分页600条记录。例如,对于6个分区,我每个分区可以处理100条记录,但是由于最后100条记录非常庞大,因此会发生缓冲区溢出。

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

有没有理由禁止spark.kryoserializer.buffer.max超过2g。

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

欣赏任何想法。

2 个答案:

答案 0 :(得分:0)

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

有关更多详细信息,请参阅以下链接。 https://github.com/apache/spark/commit/49d2ec63eccec8a3a78b15b583c36f84310fc6f0

请增加分区号,因为您无法优化处理方法。

答案 1 :(得分:0)

在这些记录中,您有什么击破了kryo缓冲区。 通常,将分区默认设置为200应该总是一个好的起点。不要将其减少到6。

单个记录(行)看起来超出了限制。 您可以尝试csv options来读取csv数据的方法有很多。 如果只有一行转换为2GB的缓冲区溢出,我会考虑以不同的方式解析文件。 如果您give it a schema,csv阅读器还会忽略/跳过文件中的某些文本(不进行序列化)。 如果您从架构中删除了一些非常大的列,则很容易读取数据。