Spark的内存管理

Spark所有的运行服务都是JVM进程。内存分为堆内内存和堆外内存,分别是JVM内部管理和操作系统内存。

  • 堆内内存:On-Heap Memory,由spark.executor.memory指定。Spark采用规划式管理堆内存,也就是不是准确的。对非序列化(序列化本质是Byte数组)对象只能估算内存,不知道确切的。静态内存管理:现在不用这种了。主要分为:Other,用于存储元数据以及没有被cache的RDD数据,默认占20%;Execution内存区域,主要保存Shuffle阶段的内存,大小由spark.shuffle.memoryFraction指定,默认20%;Storage区域,存储所有缓存的数据以及广播的数据,其中有一块unroll,用于存储RDD执行缓存后的数据。因为计算不准确另外还会预留一定内存空间。
  • 堆外内存:Off-Heap Memory,向操作系统申请。基于JDK Unsafe API实现。默认不启用,可通过参数spark.memory.offHeap.enabled设为true开启,spark.memory.offHeap.size设置大小。

在Spark-1.6版本以后使用动态内存管理:堆内存如下图所示:
在这里插入图片描述

堆外内存如下图所示:
在这里插入图片描述

箭头表示可以上下浮动,动态占用(借用)。使用spark.storage.storageFraction参数设置内存区域范围。内存空间不足时(是指不足以放下一个Block)则存储到磁盘。Execution内存被Storage占用可以让其存入磁盘,然后归还所借空间。Storage内存空间被Execution占用后无法让对方归还,因为需要考虑Shuffle过程中的很多因素,较复杂。

Other中的数据块Block(Partition)中的数据(Record)是不连续的,向Storage中存储(Persist)后,在Storage中一个Partition(Block)是连续的了(开辟一个空间存放),这个过程称为Unroll。Storage中的空间不够了会按照LRU的方式删除旧的数据。Execution内存区域主要存储Shuffle过程的相关数据,包括ShuffleWrite(也就是Map端,采用普通或Tungsten排序方式,分别采用ExternalSorter和ShuffleExternalSorter,第二种将堆内堆外混合使用,上层再建立一层逻辑,类似内存页,页码和偏移量,管理空间)和ShuffleRead(Reduce端,交给Aggregator处理,占用堆内内存)。

在Executor和Driver中都有管理数据的BlockManager,Driver还有BlockManagerMaster。一个BlockManager中有DiskStore和MemoryStore,其中还有BlockTransferService负责和其他Executor通讯获取数据。BlockManager会向Driver的BlockManagerMaster注册和通讯,BlockManagerMaster会存储BlockManager的存放数据的信息。在Executor上执行任务并不获取广播变量,使用时BlockManager才去Driver的BlockManager拉取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值