Spark 1.6以后的内存管理机制

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。。

时间: 2024-10-01 08:40:00

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

Spark内存管理机制

Spark内存管理机制 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优. 在执行 Spark 的应用程序时,Spark 集群会启动 Driver 和 Executor 两种 JVM 进程,前者为主控进程,负责创建 Spark 上下文,提交 Spark 作业(Job),并将作业转化为计算任务(Task),在各个 Executor 进程间协调任务的调度,后者负责在

内存管理机制

Objective-C中提供了两种内存管理机制MRC(MannulReference Counting)和ARC(Automatic Reference Counting),分别提供对内存的手动和自动管理,来满足不同的需求. ARC: ARC是Auto Reference Counting的缩写,即自动引用计数,由编译器在代码合适的位置中自动添加retain/Release/Autorelease/dealloc方法从而进行内存管理. ARC几个要点: 在对象被创建时 retain count

Linux内存管理机制

一.首先大概了解一下计算机CPU.Cache.内存.硬盘之间的关系及区别. 1.  CPU也称为中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路, 是一台计算机的运算核心(Core)和控制核心( Control Unit).它的功能主要是解释计算机指令以及处理计算机软件中的数据.中央处理器主要由三核心部件组成,运算器.控制器和总线(BUS),运算器又主要由算术逻辑单元(ALU)和寄存器(RS)组成. 2.Cache即高速缓冲存储器,是位于CPU与主内存

cocos2dx[3.2](24)——内存管理机制

[参考] http://zh.wikipedia.org/wiki/引用计数 (引用计数--维基百科) http://cn.cocos2d-x.org/tutorial/show?id=2300 (引用计数和自动释放池) http://cn.cocos2d-x.org/tutorial/show?id=1331 (内存管理--绕不过去的坎) http://blog.csdn.net/legendof1991/article/details/23360131 (内存优化) https://gith

iOS内存管理机制

概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存.其他高级语言如C#.Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护.今天将着重介绍ObjC内存管理: 引用计数器 属性参数 自动释放池 引用计数器 在Xcode4.2及之后的版本中

32位机内存管理机制(上)

一直有看linux内核的冲动,内核有些部分是汇编编写的,无奈汇编不大懂,所以利用五一三天假期大概走了一边8086CPU架构的汇编,8086CPU还是16位的,我们现在都进入64位时代了,这两者之间有很大的区别,但是看看16位的CPU汇编还是很重要的,这有助于理解32位的80386CPU.这篇文章来分析下80386的内存管理的一些基础知识,包括实模式.保护模式和内存寻址等等. 1.实模式 处理器被复位或者加电的时候以实模式启动.这时候处理器中各寄存器以实模式的初始化值工作. 80386处理器在实模

轻量级操作系统FreeRTOS的内存管理机制(三)

本文由嵌入式企鹅圈原创团队成员朱衡德(Hunter_Zhu)供稿. 轻量级操作系统FreeRTOS的内存管理机制(二)中讲到,heap2.c的内存管理机制会导致内存碎片的问题,系统运行久后会出现无法分配大块内存的情况,heap4.c中的管理机制提供了解决方法,它是在heap2.c的基础上添加了地址相邻空闲块间合并的功能,而heap5.c是对heap4.c的进一步扩展,它能够支持多块不连续分布的RAM空间作为堆使用,本篇将对heap4.c.heap5.c中的管理机制进行分析. 一.heap4.c

轻量级操作系统FreeRTOS的内存管理机制(二)

本文由嵌入式企鹅圈原创团队成员朱衡德(Hunter_Zhu)供稿. 上一篇文章中介绍了FreeRTOS多种内存管理机制中最简单的一种:全局声明一个静态数组ucHeap,然后通过指针偏移记录空间的分配情况,在这种内存机制下无法对内存进行释放.同时也介绍了内存操作过程中字节对齐的细节,本篇文章将会对FreeRTOS源码中第二种内存管理机制heap2.c进行讲解,在heap2.c中同样使用一个全局静态数组ucHeap来表示内存,heap2.c内存管理机制较heap1.c而言增加了内存释放的功能,通过使

[转载] python的内存管理机制

本文为转载,原作为http://www.cnblogs.com/CBDoctor/p/3781078.html,请大家支持原作者 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值.对Python语言来讲,对象的类型和内存都是在运行时确定的.这也是为什么我们称Python语言为动态类型的原因(这里我们把动态类型可以简单的归结