当前位置:首页 > 内存 > 正文

spark的内存管理

  • 内存
  • 2024-07-04 09:17:52
  • 2633

一、大疆晓spark支持多大呢?sd卡Spark支持最大容量为64GB的MicroSD卡,传输速度为Class10及以上或UHS-1等级。
Spark推荐存储卡列表:
Sandisk16/32GBUHS-1MicroSDHC;
Kingston16/32GBUHS-1MicroSDHC;
Samsung16/32GBUHS-IMicroSDHC;
Sandisk64GBUHS-1MicroSDXC;/>/>金士顿64GBUHS-1MicroSDXC;
三星64GBUHS-IMicroSDXC。


二、Spark原理|内存管理Spark内存管理模块作为一个基于内存的分布式计算引擎,在整个系统中扮演着非常重要的角色。
当Spark应用程序运行时,Spark集群会启动两个JVM进程,Driver和Executor:
Spark管理的内存主要分为4个区域:
作为一个JVM进程,执行器的内存管理是基于JVM的内存管理,Spark更细粒度地分配JVM的堆空间,以充分利用内存。同时,Spark引入了堆外内存,可以直接释放worker节点的系统内存中的空间,进一步优化内存使用。
堆内存大小是在Spark应用程序启动时通过executor-memory或参数配置的。Executor中运行的并发任务共享JVM堆内存。这些任务在存储RDD数据和流数据时占用的内存被调度为存储内存,这些任务在Shuffle执行时占用的内存被调度为执行(Execution)内存。其余的没有专门规划,那些Spark内部的对象实例,或者用户定义的Spark应用程序中的对象实例,都占用剩余空间。在不同的管理方式下,这三个部分占着不同的空间。
Spark的堆内内存管理是一种逻辑上的“调度”管理,因为对象实例占用的内存的申请和释放都是由JVM完成的,Spark只有申请后才能申请和释放。之前记下了这些记忆,我们来看看具体的流程:
为了进一步优化Shuffle时的内存使用,提高排序效率,Spark引入了堆外内存,这样我就可以直接在中创建空间工作节点的系统内存用于存储序列化的二进制数据。使用JDKUnsafeAPI(从Spark2.0开始),堆外存储内存不再基于Tachyon,而是与堆外执行内存相同。基于JDKUnsafeAPI实现,Spark可以直接操作堆外内存。减少不必要的内存开销以及频繁的GC扫描和回收,提高处理性能。堆外内存可以精确地申请和释放,并且可以精确计算序列化数据占用的空间,从而相比堆内内存降低了管理难度,减少了错误。
堆外内存默认不启用,可以通过设置d参数启用,堆外空间的大小由设置。.参数。除了没有其他空间外,堆外内存的分配方式与堆内内存相同。
Spark1.6之后,默认是统一管理方式(UnifiedMemoryManager)。useLegacyMode=true参数。下面我们介绍两种内存管理模型的演变。
在Spark最初采用的静态内存管理机制下,存储内存、执行内存和其他内存的大小在Spark应用程序运行时是固定的,但用户可以在启动应用程序之前进行配置。堆内存分配如下:
Spark1.6之后引入的统一内存管理机制与静态内存管理不同的是,存储内存和执行内存共享同一空间,可以动态占用彼此的空闲空间。如下图:
最重要的优化是动态占用机制,规则如下:
新版本引入了新的配置项:
Spark凭借统一的内存管理机制,在一定程度上提高了堆内和堆外内存资源的使用,降低了开发者维护Spark内存的难度,但这并不意味着开发者就可以高枕无忧了并放松。例如,如果存储空间太大或者内存中存储的数据过多,就会导致频繁的全垃圾回收,降低任务执行的性能,因为缓存的RDD数据通常会在内存中停留很长时间时间。因此,要充分利用Spark的性能,开发人员需要进一步了解存储内存和执行内存的管理方法和实现原理。