spark社区bug

发布时间 2023-08-11 14:51:04作者: 平平淡淡以明志

1.SPARK-26114
repartitionAndSortWithinPartitions 后合并时 PartitionedPairBuffer 的内存泄漏    

原因

这个Spark源码的issue描述了在使用coalesce操作合并分区时可能会导致PartitionedPairBuffer内存泄漏的问题。具体来说,当在使用repartitionAndSortWithinPartitions操作进行shuffle操作后,再使用coalesce操作进行分区合并时,如果某些分区需要被合并的话,需要通过PartitionedPairBuffer存储更多的元素。如果合并分区的规模过大,会导致单个executor的内存使用率超过限制,导致OOM错误或executor被杀死的情况发生。

而这个issue中提到的问题是由CompletionIterator和ExternalSorter导致的内存泄漏。CompletionIterator是一个迭代器,用于在Spark任务完成时清理资源。而ExternalSorter是一个用于排序的工具类,用于对数据进行排序和合并操作。

在这个issue中,由于CompletionIterator没有正确地清理ExternalSorter中的资源,导致ExternalSorter内存泄漏。具体来说,当使用repartitionAndSortWithinPartitions操作时,会创建多个ExternalSorter对象,这些对象在排序和合并操作完成后,需要被释放。但是由于CompletionIterator没有正确地清理这些对象,导致这些对象一直占用着内存,从而导致内存泄漏问题。

为了解决这个问题,需要在CompletionIterator中添加对ExternalSorter对象的清理操作,以确保这些对象在任务完成后能够被正确地释放。通过这个操作,可以避免由于CompletionIterator和ExternalSorter导致的内存泄漏问题,提高Spark任务的稳定性和可靠性。