1 个回答
执行内存主要用来存储任务在执行Shuffle时占用的内存,Shuffle是按照一定规则对RDD数据重新分区的过程,我们来看Shuffle的Write和Read两个阶段对执行内存的使用:
Shuffle Write
Shuffle Write
若在map端选择普通的排序方式,会常用ExternalSorter进行排序,在内存中存储数据时主要占用对内执行空间。若在map端选择Tungsten的排序方式,则采用ShuffleExternalSorter直接以序列化形式存储的数据排序,在内存中存储数据时可以占用堆外或堆内执行空间,取决于用户是否开启了堆外内存以及堆外执行内存是否足够。
Shuffle Read在对reduce端的数据进行聚合时,要将数据交给Aggregator处理,在内存中存储数据时占用堆内执行空间。如果需要进行最终结果排序,则要再次将数据交给ExternalSorter处理,占用堆内执行空间。
在ExternalSorter和Aggreator中,Spark会使用一种叫AppendOnlyMap的哈希表在堆内执行内存中存储数据,但在Shuffle过程中所有数据并不能都保存该Hash表中,当这个Hash表占用的内存会进行周期性采样,当其大到一定程度,无法再从MemoryManager申请到新的执行内存时,Spark就会将其全部内容存储到磁盘文件中,这个过程被称为溢存(Spill),溢存到磁盘的文件最后被归并(Merge)。发布于:3个月前 (01-22) IP属地:四川省
我来回答
您需要 登录 后回答此问题!