Apache Spark 内存管理详解
Apache Spark 内存管理详解2017-5-1Apache Spark内存管理详解- mengdan的专栏-博客频道- CSDN. NETGridview行编辑中(697)图1.堆内和堆外内存示意图c# winform序只(618)网站上面漂浮的图.(515)WorkerThe web services ( (474)知识库1:了解Oa(404)ExecutorOn-heap MemoryTomcat启动过程中(390)S配讨程中出现(373)lquery学习日记(370)TaskTaskTask评论排行快速回复文章标颗测试(2Off-heanExecutors配置过程中出现(1)On-heap MemoryMemo,女我要收C# winform稈序只(0)八返回顶部webservice回da(0)Gridview行编辑中(0)TaskTaskTaskTomcat启动讨程中(0)iQue诜择器query学习日记1(0)jquery学习日记(0)Apache spark内在(0)1.1堆内内存推荐文章堆内内存的大小,由 Spark应用程序启动时的- executor-memory或 spark executor. memory参CSDN日报20170429数配置。 Executor内运行的并发任务共享丿M堆内内存,这些任务在缓存RDD数据和广播《程序修行从“拔刀Broadcast)数据时占用的内存被规划为存储( Storage)内存,而这些任务在执行 Shuffle时占术”到万剑诀”》用的内存被规划为执行( Execution)内存,剩余的部分不做特殊规划,那些 Spark内部的对象实关闭http://blog.csdnnet/mengyidan/articledetails69396719222017-5-1Apache Spark内存管理详解- mengdan的专栏-博客频道- CSDN. NET抓取网易云音乐歌曲热例,或者用户定义的 Spark应用程序中的对象实例,均占用剩余的空间。不同的管理模式下,这三门评论生成词云部分占用的空间大小各不相同(下面第2小节会进行介绍)。* Android ndK开发之从环境搭建到Demo级十步Spark对堆内内存的管理是—种逻辑上的”规划式″的管理,因为对象实例占用内存的申请和释放都流由ⅣM完成,Spak只能在申请后和释放前记录这些内存,我们来看其具体流程*个人的中小型项目前端申请内存架构浅谈基于卷积神经网络1. Spark在代码中new一个对象实例CNN)的中文垃圾邮件检2.JVM从堆内内存分配空间,创建对象并返回对象引用测3. Spark保存该对象的引用,记录该对象占用的内存x四无年轻人如何逆袭释放内存快速回复最新评论1. Spark记录该对象释放的内存,删除该对象的引用☆我要收藏文童标测试2.等待八M的垃圾回收机制释放该对象占用的堆內內存Carson ho:吓死了八返回顶部文章标测试我们知道,MM的对象可以以序列化的方式存储,序列化的过程是将对象转换为二进制字书沉summary Live:这是网站质上可以理解为将非连续空间的链式存储转化为连续空间或块存储,在访问时则需要进行序列化的逆内部测试还是什么?吓我一跳。过程——反序列化,将字节流转化为对象,序列化的方式可以节省存储空间,但增加了存储和读取时ls配詈讨稈中出现的l候的计算开销。woaient:你好,我想请对于 Spark中序列化的对象,由于是字节流的形式,其占用的内存大小可直接计算,而对于非序列问下: TOMCAT和ss服务器是怎么整合的,坐化的对象,其占用的内存是通过周期性地采样近似估算而得,即并不是每次新增的数据项都会计算-等!呵呵次占用的內存大小,这种方法降低了时间开销但是有可能误差较大,导致某一时刻的实际内存有可能远远超出预期[2]。此外,在被 Spark标记为释放的对象实例,很有可能在实际上并没有被VM回收,导致实际可用的内存小于 Spark记录的可用内存。所以 Spark并不能准确记录实际可用的堆内内存,从而也就无法完全避兔内存溢出(OOM, Out of Memory)的异常。虽然不能精准控制堆内内存的申请和释放,但 Spark通过对存储內存和执行内存各自独立的规划管理,可以决定是否要在存储内存里缓存新的RDD,以及是否为新的任务分配执行内存,在一定程度上可以提升内存的利用率,减少异常的出现关闭http://blog.csdnnet/mengyidan/articledetails693967192017-5-1Apache Spark内存管理详解- mengdan的专栏-博客频道- CSDN. NET1.2堆外内存为了进步优化内存的使用以及提高 Shuffle时排序的效率, Spark引入了堆外(Of-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,存储经过序列化的二进制数据。利用 JDK UnsafeAP(从 Spark2.0开始,在管理堆外的存储内存时不再基于 Tachyon,而是与堆外的执行内存样,基于 JDK Unsafe apl实现3]),Spak可以直接操作系统堆外内存,减少了不必要的内存开销,以及频繁的GC扫描和回收,提升了处理性能。堆外内存可以被精确地申请和释放,而且序列化的数据占用的空间可以被精确计算,所以相比堆內內存来说降低了管理的难度,也降低了误差。在默认情况下堆外内存并不启用,可通过配置 spark memory. offHeap enabled参数启用,并由spark memory. offHeap.size参数设定堆外空间的大小。除了没有 other空间,堆外内存与堆内内存的划分方式相同,所有运行中的并发任务共亨存储内存和执行內存。快速回复1.3内存管理接口☆我要收藏ark为存储内存和执行内存的管理提供了统的接口— MemoryManager,同个EXA返回部的任务都调用这个接口的方法来申请或释放内存清单1.内存管理接口的主要方法1//申请存储内存2 def acquireStorageMemory (blockId: BlockId, numBytes: Long, memoryMoc3//申请展开内存4 def acquireUnrollMemory(blockId: BlockId, numBytes: Long, memoryMode5//申请执行内存6 def acquireExecutionMemory(numBytes: Long, taskAttemptId: Long, memc7/释放存储内存8 def releasestorageMemory (numBytes Long, memoryMode: MemoryMode):Ur9//释放执行内存10 def releaseExecutionMemory(numBytes: Long, taskAttemptId: Long, memc11//释放展开内存12 def releaseUnrollMemory(numBytes Long, memory Mode: Memory Mode): Uni *E]http://blog.csdnnet/mengyidan/articledetails693967195/222017-5-1Apache Spark内存管理详解- mcngyidan的专栏-博客频道- CSDN. NET我们看到,在调用这些方法时都需要指定其内存模式( Memory Mode),这个参数决定了是在堆内还是堆外完成这次操作。MemoryManager的具体实现上, Spark1.6之后默认为统一管理( Unified Memory Manager)方式,16之前采用的静态管理( Static Memory Manager)方式仍被保留,可通过配置spark memory. useLegacyMode参数启用。两种方式的区别在于对空间分配的方式,下面的第2小节会分别对这两种方式进行介绍。2.内存空间分配2.1静态内存管理快速回复在 Spark最初采用的静态内存管埋机制下,存储内存、执行内存和其他内存的大小在Spak☆我要收意序运行期间均为固定的,但用户可以应用程序启动前进行配置,堆内内存的分配如图2所示图2.静态内存管理图示—堆内八返回顶部关闭http://blog.csdnnet/mengyidan/articledetails6939671962017-5-1Apache Spark内存管理详解- mcngyidan的专栏-博客频道- CSDN. NET预留Reserved(60%*10%=6%)可防止0M白1- spark storage safety fraction控制可用的 Storage内存Storage内存区域用于缓存RD数据和boat数据一60%由 spark storage. memory Fraction控制由 spark storage. safetyFraction决定Storage(60%9%=54%)(默认为0.6,占系统内存的60‰(默认0.9,占 Storage总内存的90%)用于 unroll缓存 terator形式的 Block数据由 spark storage. unrollFraction控制一(默认0.,2,占可用 Storage内存的20%Unroll (60%*90%*20%预留Reserved(20%*20%=4%)可防止oExecution内存区域由1 spark. shuffle. safetyFraction控制1 20% E# spark. shuffle. memoryFractionExecution(20%*80%=16%)(默认为02,占系统内存的20快速回复可用的 Execution内存一用于缓存在 shuffle过程中的中间数据☆我要收藏由 spark. shuffle. safety Fraction控制默认08,占 Execution总内存的90%其它Other(20%6)20%取决于上面两部分的大小月户定义的数据结构一八返回顶部(默认为0.2,占系统内存的20或 Spark内部元数据Wn-heap内存可以看到,可用的堆内内存的大小需要按照下面的方式计算:清单2.可用堆内内存空间1可用的存储内存= systemMaxMemory* spark. storage. memoryFraction*spar2可用的执行内存= systemMaxMemory*park, shuff1e. memoryFraction*spar其中 systemMaxMemory取决于当前JM堆内内存的大小,最后可用的执行内存或者存储内存要在此基础上与各自的 memory Fraction参数和 safety Fraction参数相乘得出。上述计算公式中的两个 safetyFraction参数,其意义在于在逻辑上预留出1- safety Fraction这么一块保险区域,降低因实际内存超出当前预设范围而导致OOM的风险(上文提到,对于非序列化对象的内存采样估算会产生误差)。值得注意的是,这个预留的保险区域仅仅是一种逻辑上的规划,在具体使用时 Spark并关闭http://blog.csdnnet/mengyidan/articledetails6939671971222017-5-1Apache Spark内存管理详解- mcngyidan的专栏-博客频道- CSDN. NE没有区别对待,和”其它内存”一样交给了M去管理。堆外的空间分配较为简单,只有存储内存和执行内存,如图3所示。可用的执行内存和存储内存占用的空间大小直接由参数 spark memory- storageFraction决定,由于堆外内存占用的空间可以被精确计算,所以无需再设定保险区域图3.静态内存管理图示—堆外StorageStorage内存50%由 Ispark. memory. storageFraction控制(默认为0.5,占堆外可用内存的50%)快速回复☆我要收藏Execution50% Execution内存八返回顶部0ff-heap内存静态内存管理机制实现起来较为简单,但如果用户不熟悉 Spark的存储机制,或没有根据具体的数据规模和计算仼务或做相应的配置,很容易造成″一半海水,一半火焰”的局面,即存储内存和抉行内存中的一方剩余大量的空间,而另一方却早早被占满,不得不淘汰或移岀旧的内容以存储新的内容。由于新的内存管理机制的出现,这种方式目前已经很少有开发者使用,出于兼容旧版本的应用程序的目的,Spak仍然保留了它的实现2.2统一内存管理park1.6之后引入的统一內存管理机制,与静态內存管理的区别在于存储内存和执行內存共享同块空间,可以动态占用对方的空闲区域,如图4和图5所示关闭http://blog.csdnnet/mengyidan/articledetails693967192017-5-1Apache Spark内存管理详解- mengdan的专栏-博客频道- CSDN. NET图4.统一内存管理图示——堆内Storage内存用于缓存数据由 spark storage storage Fraction控制(默认为0.5,占统一为存的50%Storage (Us动态占用机制Unified Memary若己方不足对方空会则可占用对方统一内存Execution内存被对方占用后可强制收回Storage和 Execution共用由控制( Spark2.0+默认为Execution内存Execution (Usable*60 %*50%)0.6,占可用内存的60%Usable memory用于缓存在执行 shufflespak1.6默认为075)可用内存讨程中产牛的中间数据,等于泵统内存减去由1-控制预留内存快速回复Other其它ble*40%用户定义的数据结构默认占可用内存的☆我要收藏或5ark内部元数据八返回顶部Reserved memory作用与 Other相司System Reserved(300M)预留内存叫保摩留出足够的空间默认300JWon-heap内存图5.统一内存管理图示——堆关闭idan/article/details/ 693967199/222017-5-1Apache Spark内存管理详解- mcngyidan的专栏-博客频道- CSDN. NETStorageStorage内存50%由 spark. memory storage Fraction控制(默认为0.5,占堆外可用内存的50%)动态占用机制Execution50% Execution p存快速回复☆我要收藏0千f-heap内存其中最重要的优化在于动态占用机制,其规则如下:八返回顶部设定基本的存储内存和执行内存区域( spark storage. storageFraction参数),该设定确定了双方各自拥有的空间的范围双方的空间都不足时,则存储到硬盘;若己方空间不足而对方空余时,可借用对方的空间;(存储空间不足是指不足以放下一个完整的 Block)执行内存的空间被对方占用后,可让对方将占用的部分转存到硬盘,然后″归还”借用的空间存储内存的空间被对方占用后,无法让对方”归还”,因为需要考虑 Shuffle过程中的很多因素,实现起来较为复杂图6.动态占用机制图示关闭http://blog.csdnnet/mengyidan/articledetails6939671910/2
暂无评论