在spark里面,内存管理有两块组成,一部分是JVM的堆内内存(on-heap memory),这部分内存是通过spark dirver参数executor-memory以及spark.executor.memory来进行指定;
另外一部分是堆外内存(off-heap memory),堆外内存默认是关闭,需要通过spark.memory.offheap.enabled以及spark.memory.offheap.size来进行开启以及设置大小;堆外内存在可以实现回收迅速(GC是周期性回收),同时扩大了JVM的可控内存。
内存管理有两类,分别是分别是executor以及storage,前者是在计算的时候shuffle等操作需要占用的内存,后者则是在RDD缓存所占用的内存空间。
内存分配有两种类型,分别是静态内存分配,和统一内存分配,这两种内存分配类型的差别就在于storage和executor连着内存的分界线,静态内存分配是executor以及storage两者内存是静态的,根据公式计算出来;统一内存管理则不具体做划分根据各自需要;如果两者都不够用,则序列化到内存中;如果某一个方内存不够,总内存还有余富,则自动扩充内存。
对于内存分配之storage域而言,主要是用于RDD的缓存,在缓存的时候可以指定存储策略;另外当RDD被cache之后,存储空间将会有不连续的空间变为连续空间,这个过程称之为unroll;这部分内存的管理是通过LinkedHashMap来进行空间管理;作为缓存,如果内存空间不够了,将会基于LRU策略进行淘汰(Eviction),对于淘汰的block如果配置缓存策略中包含磁盘策略,则会序列化到物理磁盘进行保存,这个过程称之为落盘(Drop)。
对于内存分配之executor域而言,每个Task将会分配到当前分配大小的[1/2N~1/N](这里强调当前是因为如果分配类型是统一内存管理将会动态变化)大小的空间,executor域的内存主要是shuffle使用,这里包括了两个场景,shuffle write和shuffle read,write占用内存策略比较复杂,如果是普通排序,主要是用的堆内内存,如果是Tungsten排序,则是堆外内存结合堆内内存(如果堆外内存不够)的方式(前提是配置了对外内存);至于排序方式是普通排序,还是Tungsten是由Spark来决定的。对于shuffle read而言,主要是用的堆内内存。
 
参考:

最新文章

  1. Global.asax文件说明
  2. c++ 静态持续变量
  3. matlab函数bwareaopen的详解
  4. OpenCV是什么?
  5. Unity协程(Coroutine)管理类——TaskManager工具分享
  6. Ajax返回类型JSON,XML
  7. Linux-lsof命令
  8. cwm-recovery自动生成工具
  9. objective-c中的category
  10. Zend server最大化应用程序的性能、扩展性和可用性
  11. 数据库【mysql篇】典型的一些练习题目
  12. 报错org.apache.hadoop.mapreduce.lib.input.FileSplit cannot be cast to org.apache.hadoop.mapred.FileSplit
  13. 通配符 Globbing赏析
  14. java——慎用可变参数列表
  15. ecshop 添加后台页面以及设置权限
  16. javascript strict mode
  17. stm32 Flash读写[库函数]
  18. 【liunx】nslookup命令
  19. nagios监控安装esxi的服务器(宿主机)
  20. 【HDU4336】Card Collector (动态规划,数学期望)

热门文章

  1. Leetcode 106
  2. oracle EBS上传和下载文件(转)
  3. HttpServletResponse输出的中文乱码
  4. hidden="hidden",display:none, visibility:hidden 三者的区别
  5. PHP:第二章——PHP中的while语句
  6. httpclient 连接路由
  7. [转载]request.getServletPath()方法
  8. Java——IO类 字节流概述
  9. docker容器,镜像常用操作
  10. 福大软工1816 · 第八次作业(课堂实战)- 项目UML设计(团队)