spark core源码阅读-内存管理(七)

本文深入探讨Spark Core的内存管理,包括存储级别如MEMORY_ONLY和OFF_HEAP的详细说明,以及MemoryManager的两大类型:StaticMemoryManager和UnifiedMemoryManager的工作原理。文章还介绍了内存的主要用途,如Storage Memory、Execution Memory和Unroll Memory,并分析了数据的写入和读取过程,涉及到BlockManager、BlockTransferService等关键组件的作用。此外,提到了数据读取过程中Netty Client和Server的角色及交互流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spark core源码阅读-内存管理(七)

存储级别

每个StorageLevel都会记录是否使用内存或ExternalBlockStore,
如果内存或ExternalBlockStore内存不足,是否将RDD丢弃到磁盘,
是否以串行化格式保存内存中的数据以及是否在多个节点上复制RDD分区。

class StorageLevel private(
    private var _useDisk: Boolean,//磁盘
    private var _useMemory: Boolean,//内存
    private var _useOffHeap: Boolean,//堆外内存
    private var _deserialized: Boolean,//是否序列化
    private var _replication: Int = 1)//副本数量

根据StorageLevel类定义以下级别:
NONE,DISK_ONLY,DISK_ONLY_2,MEMORY_ONLY = new Sto
MEMORY_ONLY_2,MEMORY_ONLY_SER,MEMORY_ONLY_SER_2,MEMORY_AND_DISK,
MEMORY_AND_DISK_2,MEMORY_AND_DISK_SER,MEMORY_AND_DISK_SER_2,
OFF_HEAP(与MEMORY_ONLY_SER类似,但将数据存储在堆外存储器中)

内存管理-MemoryManager

Reserved Memory: spark 运行时driver或executor jvm进程消耗的内存
User(Other) Memory: 可以保存用户自己数据,比如mapPartitions用户用来聚合数据
Storage Memory: 包括broadcast数据,rdd中cache数据
Execution Memory: spark core运行task时使用,在shuffle时map中sort/aggregation时需要缓存部分数据,缓存不足溢出磁盘
Unroll:
正如看到那样,迭代器数据cache到内存,这里使用数内存就是Unroll Memory,如果内存不足又不能溢出磁盘,则不能缓
存直接返回,下次使用的时候只能重新计算

  • StaticMemoryManager
    这种静态分配导致storage与execution对内存利用不是很充分
    storage memory: 54% 预留: 6%
    unroller memory: 10.8%
    storage memory: 43.2%
    execution memory: 16% 预留: 4%
    other: 20%

    private def getMaxStorageMemory(conf: SparkConf): Long = {
      val systemMaxMemory = conf.getLong("spark.testing.memory", Runtime.getRuntime.maxMemory)
      val memoryFraction = conf.getDouble("spark.storage.memoryFraction", 0.6)
      val safetyFraction = conf.getDouble("spark.storage.safetyFraction", 0.9)
      (systemMaxMemory * memoryFraction * safetyFraction).toLong
    }
    private def getMaxExecutionMemory(conf: SparkConf): Long = {
      val systemMaxMemory = conf.getLong("spark.testing.memory", Runtime.getRuntime.maxMemory)
      val memoryFraction = conf.getDouble("spark.shuffle.memoryFraction", 0.2)
      val safetyFraction = conf.getDouble("spark.shuffle.safetyFraction", 0.8)
      (systemMaxMemory * memoryFraction * safetyFraction).toLong
    }
    private val maxUnrollMemory: Long = {
      (maxStorageMemory * conf.getDouble("spark.storage.unrollFraction", 0.2)).toLong
    }
  • UnifiedMemoryManager
    预留300M,JVM至少450M,MaxMemory=(JVM-300M)*75%,还有25%other,默认storage占MaxMemory的50%,storage与execution
    可以根据需要在对方空余的情况下占用空余的内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值