|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
分类:
bdv018-spark.v03
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」