存储内存管理:RDD的持久化
1,如果持久化的级别是纯磁盘级别,直接调用BlockManager的toPut方法写入磁盘
2,持久化的级别是内存级别,此时尝试使用 UnRoll方法,尝试将数据安全的保存的内存之中,如果内存不够,就会淘汰,再将数据写入内存之中
1),淘汰: 新的block缓存到内存不足时,淘汰掉旧的block
2),落盘:如果设定存储到磁盘,那么久存储到磁盘,否则就会删除
3),淘汰规则,淘汰的都是相同的 MemoryMode(堆内或者堆外),新旧block不能属于同一个RDD(避免死循环),block不能是被读状态,遍历LinkedHashMap,按照最少使用进行淘汰
3,关于 UnRoll 方法:RDD缓存到内存之后,Partition转换成Block
4,每一个 Executor的Storage模块用一个链式Map结构(LinkedHashMap)管理堆内和堆外内存所有的Block实例,并且间接的记录了内存的申请与释放
spark 内存管理:
1,Driver端,只是简单地程序,内存管理比较简单
2,Executor端:分为堆内内存与堆外内存
1),堆内内存指的是executor进程的内存,task 共享堆内内存
2),堆外内存指的是work内存(计算机内存 free -g),executor 共享堆外内存
spark 对堆内内存的管理方式:申请和释放都是jvm 进行完成的,spark(受制于JVM)只是在申请和释放之后进行记录
1,申请内存:new一个对象实例,spark保存该对象的引用,记录该对象占用的内存(采样,推算)
2,记录该对象删除的引用,记录该对象所占用的堆内内存
spark堆外内存的计算:
1,spark 可以直接的操作系统堆外内存,减少不必要的内存消耗,以便于频繁的GC扫描与回收
2,基于 jdk Unsafe API实现
3,可以使用 spark.memory.offHeap.enabled 参数启用
cache 指的是 RDD永久性的保存到内存之中:
1,cache(memory-only) 并不是绝对安全的一种形式存储数据形式
2,checkpoint(分布式文件系统) 才是安全的, 一般是cache与 memory