spark2.2.0源码阅读---spark core包 --- launcher/memory包

1、本文目标以及其它说明:

    本文主要是介绍launcher/memory两个包的数据结构

2、launcher包下面的数据结构说明

    

private[spark] abstract class LauncherBackend {

用来和启动服务器进行对话的。会创建BackendConnection对象,立面又封装了Socket,Socket有能够获取输入输出流

private[spark] class WorkerCommandBuilder(sparkHome: String, memoryMb: Int, 
command: Command)    extends AbstractCommandBuilder {
用来构建的是java jvm命令

3、memory包下面的数据结构说明

    
private[memory] class ExecutionMemoryPool(
    lock: Object,
    memoryMode: MemoryMode

) extends MemoryPool(lock) with Logging {

立面维护了一个

@GuardedBy("lock")
private val memoryForTask = new mutable.HashMap[Long, Long]() 变量。key是任务ID,value是
当前任务使用的内存大小。任务申请了内存就会在集合立面注册、释放内存就会从集合立面移除或者减少value的值。

private[spark] abstract class MemoryManager(
    conf: SparkConf,
    numCores: Int,
    onHeapStorageMemory: Long,
    onHeapExecutionMemory: Long) extends Logging { 用于管理堆上、非堆上运行和存储的内存分配
 
@GuardedBy("this")
protected val onHeapStorageMemoryPool = new StorageMemoryPool(this, MemoryMode.ON_HEAP)
@GuardedBy("this")
protected val offHeapStorageMemoryPool = new StorageMemoryPool(this, MemoryMode.OFF_HEAP)
@GuardedBy("this")
protected val onHeapExecutionMemoryPool = new ExecutionMemoryPool(this, MemoryMode.ON_HEAP)
@GuardedBy("this")
protected val offHeapExecutionMemoryPool = new ExecutionMemoryPool(this, MemoryMode.OFF_HEAP)
private[memory] abstract class MemoryPool(lock: Object) { 内存池
 
@GuardedBy("lock")
private[this] var _poolSize: Long = 0
立面就维护了这么一个字段,用于表示当前内存池的大小,因为是var 所以可以增加内存大小、亦可以减少。
private[spark] class StaticMemoryManager(
    conf: SparkConf,
    maxOnHeapExecutionMemory: Long,
    override val maxOnHeapStorageMemory: Long,
    numCores: Int)
  extends MemoryManager(
    conf,
    numCores,
    maxOnHeapStorageMemory,
    maxOnHeapExecutionMemory) {
只支持对堆的内存管理,其实立面就维护了pool对象,pool立面有一个总大小、已使用的字段,申请分配的时候就是
修改已使用的字段。

 

private[memory] class StorageMemoryPool(
    lock: Object,
    memoryMode: MemoryMode

) extends MemoryPool(lock) with Logging {

主要是通过修改

@GuardedBy("lock")
private[this] var _memoryUsed: Long = 0L  
@GuardedBy("lock")
private[this] var _poolSize: Long = 0
这两个字段来进行的管理。

private[spark] class UnifiedMemoryManager private[memory] (
    conf: SparkConf,
    val maxHeapMemory: Long,
    onHeapStorageRegionSize: Long,
    numCores: Int)
  extends MemoryManager(
    conf,
    numCores,
    onHeapStorageRegionSize,
    maxHeapMemory - onHeapStorageRegionSize) {
简单地说,这个类的策略是这样的。比如:总共分配2G(用于存储和执行任务),1g用于存储,1g用于运行。当

存储用满了1G后,发现运行还有剩余的0.5G,那么存储会到运行这边去借用。反过来也是。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值