我的公司有一个正在生产中的 PySpark 作业,每天都在运行,但最近失败了,而自 1 月份首次部署该作业以来,它每天都成功。
错误与 maxResultSize 相关,如下所述:https://kb.databricks.com/jobs/job-fails-maxresultsize-exception#:~:text=This%20error%20occurrs%20because%20the,the%20driver %20本地%20文件%20系统.
我将此属性的配置从默认的 1g 增加到了 2g,现在可以正常工作了。但我认为这只是暂时的解决办法。
在调试时,我注意到当我检查作业时,执行器上的任务数量每天都在不断增加,即使没有任何变化(输入数据量和输出数据量稳定)。元数据没有改变,我没有看到任何最近的数据被拉入任何不良数据。
我唯一能想到的是输入数据没有分区;事实上,每天都会添加新数据,目前 Hadoop 中的数据大小约为 4.5GB。我的工作只需要最近一天的数据,并且我有一个过滤器来获取它。
这可能是更深层次的根本原因吗?
出现此错误的原因是Executors的任务输出结果的总大小,在输出到Driver时,超出了spark.driver.maxResultSize的限制。
处理建议:
在Executors的任务中打印最终发送到Driver程序的数据量,看看每天的数据量是否在不断增加。 优化任务处理逻辑,看看是否可以提前过滤、聚合等更多的数据,从而减少返回给Driver程序的数据量。 对数据进行分区,然后分别处理这些分区,而不是一次处理所有数据。