这是spark1.5及以前堆内存分配图
下边对上图进行更近一步的标注,红线开始到结尾就是这部分的开始到结尾
spark 默认分配512MB JVM堆内存。出于安全考虑和避免内存溢出,Spark只允许我们使用堆内存的90%,这在spark的spark.storage.safetyFraction 参数中配置着。也许你听说的spark是一个内存工具,Spark允许你存储数据在内存。其实,Spark不是真正的内存工具,它只是允许你使用内存的LRU(最近最少使用)缓存 。所以,一部分内存要被用来缓存你要处理的数据,这部分内存占可用安全堆内存的60%,这个值在spark.storage.memoryFraction参数中配置。所以如果你想知道你可以存多少数据在spark中,spark.storage.safetyFraction 默认值为0.9,spark.storage.memoryFraction的默认值为0.6,
Storage=总堆内存*0.9*0.6,所以你有54%的堆内存用来存储数据。
shuffle内存:
spark.shuffle.safetyFraction * spark.shuffle.memoryFraction
spark.shuffle.safetyFraction默认为0.8或80%,spark.shuffle.memoryFraction默认为0.2或20%,则你最终可以使用0.8*0.2=0.16或16%的JVM 堆内存用于shuffle。
Unroll内存:
spark允许数据以序列化或非序列化的形式存储,序列化的数据不能拿过来直接使用,所以就需要先反序列化,即unroll。
Heap Size*spark.storage.safetyFraction*spark.storage.memoryFraction*spark.storage.unrollFraction=Heap Size *0.9*0.6*0.2=Heap Size * 0.108或10.8%的JVM 堆内存。
到此为止,你应该就知道Spark是如何使用jvm内存的了,下边是集群模式,以yarn为例,其它类似。
在Yarn集群中,Yarn Resource Manager管理集群的资源(实际就是内存)和一系列运行在集群Node上yarn resource manager及集群Nodes资源的使用。从YARN的角度,每一个 Node都代表了一个可控制的内存资源,当你向Yarn Resource Manager申请资源时,它会反馈给你哪个yarn node manager 可以连接并启动一个execution container给你。每一个execution container都是一个可以提供堆内存的JVM,JVM的位置是由Yarn Resource manager选择的。
当你在Yarn上启动Spark时,你可以指定executor的数量(–num-executors flag or spark.executor.instances parameter)、每个executor的内存大小(–executor-memory flag or spark.executor.memory parameter)、每个executor的内核数量(–executor-cores flag of spark.executor.coresparameter)、每个task执行的内核数量(spark.task.cpusparameter),你也可以指定driver的内存大小(–driver-memory flag or spark.driver.memory parameter)。
当你在集群中执行某项任务时,一个job会被切分成stages,每个stage会被分成多个task,每个task会被单独分配,你可以把这些executor看成一个个执行task的槽池(a pool of tasks execution slots)。如下看一个例子:一个集群有12个节点(yarn node manager),每个节点有64G内存、32核的CPU(16个物理内核,一个物理内核可以虚拟成两个)。每个节点你可以启动两个executors、每个executor分配26G内存(留一部分用于system process、yarn NM、DataNode).所以集群一共可以处理 12 machines * 2 executors per machine * 12 cores per executor / 1 core for each task = 288 task slots。这意味着该集群可以并行运行288个task,充分利用集群的所有资源。你可以用来存储数据的内存为= 0.9 spark.storage.safetyFraction * 0.6 spark.storage.memoryFraction * 12 machines * 2 executors per machine * 26 GB per executor = 336.96 GB。没有那么多,但是也足够了。
到此,你已经知道spark如何分配 jvm内存,在集群中可以有多少个execution slots。那么什么是task,你可以把他想像成executor的某个线程,executor是一个进程 ,它可以多线程的执行task.
下边来解释一下另一个抽象概念"Partition",你用来分析的所有数据都将被切分成partitions,那么何为一个partition,它又是由什么决定的?partition的大小是由你使用的数据源决定的,在spark中你可以使用的所有读取数据的方式,大多你可以指定你的RDD中有多少个partitions。当你从HDFS中读取一个文件时,hadoop的InputFormat决定partition。通常由InputFormat输入的每一个 split对应于RDD中的一个partition,而每一个split通常相当于hdfs中的一个block(还有一些其它情况,暂不解释,如text file压缩后传过一整个partition不能直接使用)。
一个partition产生一个task,并在数据所在的节点task slot执行(数据本地性)
语言组织不是特别好,请见谅,如有失误之处,还请多提宝贵意见。
- JVM系列(1)- JVM常见参数及堆内存分配
常见参数配置 基于JDK1.6 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收模式 -XX:+PrintGCDetails 打印更详细的GC日志 ...
- java字符串池和字符串堆内存分配
1. String str=new String("abc")和String str="abc"的字符串“abc”都是存放在堆中,而不是存在 栈中. 2. 其实 ...
- jvm 虚拟机参数_堆内存分配
1.参数 -XX:+PrintGC 只要遇到 GC 就会打印日志 -XX:+UseSerialGC 配置串行回收器 -XX:+PrintGCDetails 查看详细信息,包括各个区的情况 -XX:+P ...
- java中内存分配策略及堆和栈的比较
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...
- JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
Java栈与堆 堆:顺序随意 栈:后进先出(Last-in/First-Out). Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new.newarray.anewarray和mu ...
- 目录_Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)
1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘 ...
- ACE服务端编程3:ACE跨平台之分配堆内存
ACE服务端编程系列的第三篇,探究ACE解决不同编译器之间分配堆内存的差异. 在ACE的官方示例中会看到大量的ACE_NEW_RETURN,ACE_NEW这样的宏,这是ACE为了消除不同编译器编译的代 ...
- Unix系统编程()在堆上分配内存
在堆上分配内存:malloc和free 一般情况下,C程序使用malloc函数族在堆上分配和释放内存.较之brk和sbrk,这些函数具备不少优点: 属于C语言标准的一部分 更易于在多线程程序中使用 接 ...
- Java中堆内存与栈内存分配浅析
Java把内存划分成两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间, ...
随机推荐
- FXC Define的使用方法
https://docs.microsoft.com/en-us/windows/desktop/direct3dtools/dx-graphics-tools-fxc-syntax https:// ...
- 理解JS里的稀疏数组与密集数组
一般来说,JavaScript中的数组是稀疏的. 什么是稀疏呢?稀疏也就是说,数组中的元素之间可以有空隙,因为一个数组其实就是一个键值映射.本文解释了如何创建稀疏数组和不稀疏的数组. 1.稀疏数组 创 ...
- mac软件下载
mac软件下载 http://www.pc6.com/mac/ https://www.macx.cn/
- Microsoft.VisualStudio.DebuggerVisualizers.dll 文件位置 for VisualStudio 2015
可视化调试工具(Microsoft.VisualStudio.DebuggerVisualizers) "C:\Program Files (x86)\Microsoft Visual St ...
- Xshell连接mysql数据库乱码问题解决思路总结
乱码问题一直是一件让人头疼的事情,乱码就是编码格式不统一产生的,下面将一些常见的解决思路整理: 先Xshell连接上数据库,查看数据的编码格式: 一般需要看这么几个地方(附修改命令): 1.数据库的编 ...
- 使用jsmin压缩javascript脚本
官方地址:http://www.crockford.com/javascript/jsmin.html 点击页下方的”zip file containing an MS-DOS.exe file“下载 ...
- 解决安装完Ubuntu系统后启动项中没有Ubuntu的问题
问题出现的原因是你没有把grub安装到硬盘的起始扇区里,按理说Ubuntu在安装的时候应该能很好的处理这个问题,但有个别电脑还是会出问题.不过我们可以通用命令解决 问题. 使用U盘进入Ubuntu系统 ...
- list/tuple/dict/set
一.list(列表) 内置类型,长度可变的有序集合,索引从0开始,索引为负数是标识从右开始取,最右边第一个是-1,以此类推.里面的元素可以是不同类型的. 1.定义:a = [] #空列表 2.获取长度 ...
- 关于Fragment的懒加载问题
为了达到界面效果,我们有时需要使用到TabLayout+ViewPager的方式来布局界面,然而ViewPager的adapter总是默认把与当前可见的fragment相邻的两个fragment给加载 ...
- Unity3d 4.3 通过代码动态更改SpriteRender的Sprite
http://www.unitymanual.com/home.php?mod=space&uid=2452&do=blog&id=420 using UnityEngine; ...