|NO.Z.00106|——————————|BigDataEnd|——|Hadoop&Spark.V04|——|Spark.v04|Spark 原理 源码|内存管理&执行内存管理|

一、执行内存管理
### --- 执行内存管理

~~~     执行内存主要用来存储任务在执行 Shuffle 时占用的内存,
~~~     Shuffle 是按照一定规则对 RDD 数据重新分区的过程,
~~~     Shuffle 的 Write 和 Read 两阶段对执行内存的使用:
### --- Shuffle Write

~~~     在 map 端会采用 ExternalSorter 进行外排,在内存中存储数据时主要占用堆内执行空间。
### --- Shuffle Read

~~~     在对 reduce 端的数据进行聚合时,要将数据交给 Aggregator 处理,
~~~     在内存中存储数据时占用堆内执行空间
~~~     如果需要进行最终结果排序,则要将再次将数据交给 ExternalSorter 处理,
~~~     占用堆内执行空间在 ExternalSorter 和 Aggregator 中,
~~~     Spark 会使用一种叫 AppendOnlyMap 的哈希表在堆内执行内存中存储数据,
~~~     但在 Shuffle 过程中所有数据并不能都保存到该哈希表中,
~~~     当这个哈希表占用的内存会进行周期性地采样估算,
~~~     当其大到一定程度,无法再从 MemoryManager 申请到新的执行内存时,
~~~     Spark 就会将其全部内容存储到磁盘文件中,这个过程被称为溢存(Spill),
~~~     溢存到磁盘的文件最后会被归并。
### --- 源码提取说明

~~~     # 源码提取说明:ExternalAppendOnlyMap.scala
~~~     # 55行~66行
class ExternalAppendOnlyMap[K, V, C](
    createCombiner: V => C,
    mergeValue: (C, V) => C,
    mergeCombiners: (C, C) => C,
    serializer: Serializer = SparkEnv.get.serializer,
    blockManager: BlockManager = SparkEnv.get.blockManager,
    context: TaskContext = TaskContext.get(),
    serializerManager: SerializerManager = SparkEnv.get.serializerManager)
  extends Spillable[SizeTracker](context.taskMemoryManager())
  with Serializable
  with Logging
  with Iterable[(K, C)] {
### --- Spark 的存储内存和执行内存有着截然不同的管理方式:

~~~     # 对存储内存来说,
~~~     # Spark 用一个 LinkedHashMap 来集中管理所有的 Block,
~~~     # Block 由需要缓存的 RDD 的Partition 转化而成;
~~~     # 对执行内存来说,Spark 用 AppendOnlyMap 来存储 Shuffle 过程中的数据,
~~~     # 在 Tungsten 排序中甚至抽象成为页式内存管理,开辟了全新的 JVM 内存管理机制。

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor

 

 

posted on 2022-04-13 14:39  yanqi_vip  阅读(26)  评论(0)    收藏  举报

导航