Spark的内存空间管理是怎么样的?

提问者:帅平 问题分类:面试刷题
Spark的内存空间管理是怎么样的?
2 个回答
人潮似海遇见你°
人潮似海遇见你°
统一内存管理:
1、Spark1.6之后引入的统一内存管理机制,与静态内存管理的区别在于存储内存和执行内存共享同一块空间,可以动态占用对象的空间区域。其中重要的优化在于动态占用机制,其规则如下:设定基本的存储内存和执行内存区域(spark.storage.storageFraction参数),该设定确定了双方各自拥有的空间的范围。双方的空间都不足时,则存储到硬盘;若己方空间不足而对方空余时,可借用对方的空间。执行内存的空间被对方占用,可以让对方占用部分转存到硬盘,然后归还借用空间。存储内存的空间被对方占用后,无法让对方归还,需要考虑shuffle过程的很多因素实现起来较为复杂。
2、凭借统一内存管理机制,Spark在一定程度上提高了堆内和堆外内存资源的利用率,降低了开发者维护Spark内存的难度,但并不意味着开发者可以高枕无忧,所以如果存储内存的空间太大或者说缓存的数据过多,反而会导致频繁的全量垃圾回收,降低任务执行时的性能,因为缓存的RDD数据通常都是长期驻留内存的 。
发布于:3个月前 (01-22) IP属地:四川省
冷心丿玫瑰
冷心丿玫瑰
静态内存管理:
1、在Spark最初采用的静态内存管理机制下,存储内存、执行内存和其他内存的大小在Spark引用程序运行期间均为固定的,但用户可以引用程序启动前进行配置。可用的存储内存=systemMaxMemory * spark.storge.memoryFraction * spark.storage.safetyFraction可用的执行内存=systemMaxMemory * spark.shuffle.memoryFraction * spark.shuffle.safetyFraction
2、其中这个预留的保险区域仅仅是一种逻辑上的规划,在具体使用时Spark并没有区别对待,和其他内存一样交给了JVM去管理。堆外的内存分配较为简单,只有存储内存和执行内存,由参数spark.memory.storageFraction决定,由于堆外内存占用空间可以被精确计算,所以无需再设定保险区域。
发布于:3个月前 (01-22) IP属地:四川省
我来回答