Spark 内部管理机制

  Spark的内存管理自从1.6开始改变。老的内存管理实现自自staticMemoryManager类,然而现在它被称之为”legacy”. “Legacy” 默认已经被废弃掉了,它意味着相同的代码在1.5版本与1.6版本的输出结果将会不同。需要注意的是,出于兼容性的考虑,你依旧可以使用”legacy”,通过设置spark.memory.useLegacyMode改变。 自从spark1.6版本开始,内存管理将实现自UnifiedMemoryManager.那么新的内存管理如下图:

1、预留内存。

为系统预留的内存。同时它是写死的300MB大小。这300MB的内存大小并不在spark计算与缓存内存之中,同时它在任何情况下都不能被改变,除非重新编译或者是设置参数spark.testing.reservedMemory

事实上,它并不被spark所用,即便你想将所有的内存设置为堆内存为spark缓存数据,你也无法占用这一部分内存资源。(用来存储spark的对象信息等)所以如果你不给spark的每个executor至少1.5*Reserved Memory = 415MB,将会报 please use larger heap size的错误信息。

2、 计算内存

它是一个为spark分配的内存池。它取决于你使用它的方式,可将数据结构用于transformations操作,比如,你可以将你的聚合类操作使用mapPartitions转换为hash表的形式进行操作。那么它将消耗spark的使用内存。

在spark1.6.0的内存池中,计算内存的容量为(“java Heap”-300MB)*(1-spark.memory.fraction),如果按照默认的设置为(“java-heap”-“Reserved Memory) * 0.25。所以在代码中,我们需要根据数据量来设定相关的参数,来防止OOM的发生。

3、 存储内存

Spark的存储内存被也分为存储内存与执行内存。它们的比例可通过spark.memory.storageFraction来设置。默认值为0.5 。使用这种新的内存管理机制的好处在于,使用边界不再是静态的。

Storage Memory 这个资源池被Spark用来缓存数据以及那些没有进行展开的序列化数据作的临时空间,所有的boradcast的广播变量也存储于该缓存块中。那些没有展开的序列化数据将会被返回driver。以及所有的boadcast广播数据的等级来源于 MEMORY_AND_DISK的设置等级。

Execution Memory 这个资源池按我的理解,用来执行shuffle操作的task。它主要用于shuffle过程中map结果的缓存,是以hash作为聚合散列的。同时,支持如果没有足够的内存时,将map的结果写入磁盘。所以,不是说shuffle操作就直接将数据写入磁盘的,也是有个内存缓冲区,我还在想,连hadoop都有缓冲环了,spark还是直接写磁盘吗?NONONO。。

本文翻译自一位国外大神的博客:https://0x0fff.com/spark-memory-management/

Spark 1.6以后的内存管理机制的更多相关文章

  1. Spark内存管理机制

    Spark内存管理机制 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行 ...

  2. Spark Tungsten in-heap / off-heap 内存管理机制--待整理

    一:Tungsten中到底什么是Page? 1. 在Spark其实不存在Page这个类的.Page是一种数据结构(类似于Stack,List等),从OS层面上讲,Page代表了一个内存块,在Page里 ...

  3. 浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ...

  4. ARC内存管理机制详解

    ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数. ...

  5. 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制

    今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...

  6. 【Cocos2d-x 3.x】内存管理机制与源码分析

    侯捷先生说过这么一句话 :  源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...

  7. python的内存管理机制

    先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++,Java等语言一样,他们可以不用事先声明变量 ...

  8. Java虚拟机内存管理机制

    自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区 ...

  9. 了解linux内存管理机制(转)

    今天了解了下linux内存管理机制,在这里记录下,原文在这里http://ixdba.blog.51cto.com/2895551/541355 根据自己的理解画了张图: 下面是转载的内容: 一 物理 ...

随机推荐

  1. Jmeter增加压力机方法

    windows: 需要别人的机器也安装jmeter 在别人的机器上运行jmeter-server.bat 修改jmeter.properties文件,查找remote_hosts 原始:remote_ ...

  2. iOS信号量的使用

    Core Audio render thread and thread signalling up vote2down votefavorite   Does iOS have any kind of ...

  3. ArrowLayer : A coustom layer animation

    Since my other answer (animating two levels of masks) has some graphics glitches, I decided to try r ...

  4. 【转】家庭wifi覆盖指导

    网址:家庭wifi覆盖指导 私以为,目前民用 wifi 路由器市场已经完全走上了邪路.天线越来越大,发射功率越做越高.都敢冒着法律的风险使用大大超过 100mW 的发射功率了.且不论巨大的发射功率可能 ...

  5. javscript创建Emitter

    本文简单叙述下javascript是如何建立一个Emitter构造函数的. /** * 定义Emitter构造函数 */ function Emitter() { } /** * 添加监听事件 */ ...

  6. HashMap归档-超越昨天的自己系列

    java HashMap 读一下源码,一个数组存储数据: transient Entry[] table; 内部存key和value的内部类: static class Entry<K,V> ...

  7. Android App Build System

  8. C# 获取 oracle 存储过程的 返回值1

    /// <summary> /// 返回对应表的模拟自增字段值 /// </summary> /// <param name="tablename"& ...

  9. IOS tableview下拉刷新上拉加载分页

    http://code4app.com/ios/快速集成下拉上拉刷新/52326ce26803fabc46000000 刷新没用用插件,加载使用的MJ老师的插件. - (void)viewDidLoa ...

  10. 2016HUAS_ACM暑假集训3F - Jungle Roads

    这个题目属于最小生成树问题,可以用Prim,也可以用Kruskal(还没试).题意简单直接,给你一个图,求出它最小生成树的权值. 题目最有趣的地方就是图的顶点是字母,稍微处理一下就好了. Sample ...