是否有针对“org.apache.spark.SparkException:Kryo序列化失败:缓冲区溢出。可用:0,必需:n”错误的解决方法?

OTM*_*OTM 2 apache-spark apache-spark-sql pyspark

我正在通过 Spark-Submit 运行 pyspark 作业,其中首先将两个大型镶木地板表连接在一起,然后再应用一些附加逻辑。提交后,所有任务都失败,日志显示以下内容:

Caused by: org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow. Available: 0, required: n*. To avoid this, increase spark.kryoserializer.buffer.max value
Run Code Online (Sandbox Code Playgroud)

*n 只是一个变量,表示还需要多少内存。这个值取决于我设置的多少spark.kryoserializer.buffer.max

我已将此参数的值增加到 2047 mb,并且不再遇到错误,作业在 ApplicationMaster 作业跟踪器中显示为“完成”,但作业在控制台和纱线中仍然显示为“正在运行”。

正在运行的作业的上下文:

对于上下文,这就是我正在做的事情。我正在获取一个非常大的 URL 列表,并将它们加入到同一个列表中,并使用第二个 URL 字符串包含在第一个 URL 字符串中的匹配条件。例如:www.google.com 将匹配 www.google.com、www.google.com/1 和 www.google.com/1/2 URL_Hierarachy = URL_1.join(URL_2, URL_1.url1 == URL_2.url2. substr(URL_1.numone,URL_1.nchar_url1),'left') 其中 numone 和 nchar_url1 用于定义第一个 URL 的长度。这将产生比最初的 93M 更多的记录。

小智 6

从某种意义上说,此错误具有误导性,通常导致此错误的原因是并行性/分区分布不均匀,然后更有可能有大量数据需要序列化/反序列化。

同时spark2+使用kryoserializer作为默认的序列化器。你会得到这个错误。

我会仔细检查您的连接代码、数据帧的分区,看看大型 Spark 数据帧是否获得足够的分区/或者数据中是否存在任何偏斜。

增加并行度发生在连接处

spark-submit --conf spark.sql.shuffle.partitions=2000
Run Code Online (Sandbox Code Playgroud)

增加给定数据帧的分区

df.repartition(2000)
Run Code Online (Sandbox Code Playgroud)