国内最专业的IT技术学习网

UI设计

当前位置:主页 > UI设计 >

Spark内存调优 你会吗?

发布时间:2019/07/17标签:   内存    点击量:

原标题:Spark内存调优 你会吗?
1、概述Spark 作为一个基于内存的散布式盘算引擎,其内存治理模块在全部体系中表演着十分主要的脚色。懂得 Spark 内存治理的基础道理,有助于更好地开辟 Spark 利用顺序和停止机能调优。本文旨在梳理出 Spark 内存治理的头绪,抛砖引玉,引出读者对这个话题的深刻探究。本文中论述的道理基于 Spark 2.1 版本,浏览本文须要读者有必定的 Spark 和 Java 基本,懂得 RDD、Shuffle、JVM 等相干观点。在履行 Spark 的利用顺序时,Spark 集群会启动 Driver 和 Executor 两种 JVM 过程,前者为主控过程,担任创立 Spark 高低文,提交 Spark 功课(Job),并将功课转化为盘算义务(Task),在各个 Executor 过程间和谐义务的调理,后者担任在任务节点上履行详细的盘算义务,并将成果前往给 Driver,同时为须要长久化的 RDD 供给存储功效[1]。因为 Driver 的内存治理绝对来讲较为简略,本文重要对 Executor 的内存治理停止剖析,下文中的 Spark 内存均特指 Executor 的内存。2、堆内和堆外内存计划作为一个 JVM 过程,Executor 的内存治理树立在 JVM 的内存治理之上,Spark 对 JVM 的堆内(On-heap)空间停止了更加具体的调配,以充足应用内存。同时,Spark 引入了堆外(Off-heap)内存,使之能够间接在任务节点的体系内存中开发空间,进一步优化了内存的应用。

Spark内存调优
图 1 . 堆内和堆外内存表示图2.1 堆内内存堆内内存的巨细,由 Spark 利用顺序启动时的 –executor-memory 或 spark.executor.memory 参数设置。Executor 内运转的并发义务同享 JVM 堆内内存,这些义务在缓存 RDD 数据和播送(Broadcast)数据时占用的内存被计划为存储(Storage)内存,而这些义务在履行 Shuffle 时占用的内存被计划为履行(Execution)内存,残余的局部不做特别计划,那些 Spark 外部的工具实例,或许用户界说的 Spark 利用顺序中的工具实例,均占用残余的空间。差别的治理形式下,这三局部占用的空间巨细各不雷同。Spark 对堆内内存的治理是一种逻辑上的"计划式"的治理,由于工具实例占用内存的请求和开释都由 JVM 实现,Spark 只能在请求后和开释前记载这些内存,咱们来看其详细流程:请求内存: Spark 在代码中 new 一个工具实例 JVM 从堆内内存调配空间,创立工具并前往工具援用 Spark 保留该工具的援用,记载该工具占用的内存开释内存:Spark 记载该工具开释的内存,删除该工具的援用等候 JVM 的渣滓接纳机制开释该工具占用的堆内内存咱们晓得,JVM 的工具能够以序列化的方法存储,序列化的进程是将工具转换为二进制字节省,实质上能够懂得为将非持续空间的链式存储转化为持续空间或块存储,在拜访时则须要停止序列化的逆进程——反序列化,将字节省转化为工具,序列化的方法能够节约存储空间,但增添了存储和读取时间的盘算开支。关于 Spark 中序列化的工具,因为是字节省的情势,其占用的内存巨细可间接盘算,而关于非序列化的工具,其占用的内存是经过周期性地采样近似预算而得,即并不是每次新增的数据项都市盘算一次占用的内存巨细,这类方式下降了时光开支然而有能够偏差较大,招致某一时辰的现实内存有能够远远超越预期。别的,在被 Spark 标志为开释的工具实例,很有能够在现实上并没有被 JVM 接纳,招致现实可用的内存小于 Spark 记载的可用内存。以是 Spark 并不能正确记载现实可用的堆内内存,从而也就无奈完整幸免内存溢出(OOM, Out of Memory)的异样。固然不能精准操纵堆内内存的请求和开释,但 Spark 经过对存储内存和履行内存各自自力的计划治理,能够决议能否要在存储内存里缓存新的 RDD,以及能否为新的义务调配履行内存,在必定水平上能够晋升内存的应用率,增加异样的呈现。2.2 堆外内存为了进一步优化内存的应用以及进步 Shuffle 时排序的效力,Spark 引入了堆外(Off-heap)内存,使之能够间接在任务节点的体系内存中开发空间,存储经由序列化的二进制数据。应用 JDK Unsafe API(从 Spark 2.0 开端,在治理堆外的存储内存时不再基于 Tachyon,而是与堆外的履行内存一样,基于 JDK Unsafe API 完成[3]),Spark 能够间接操纵体系堆外内存,增加了不用要的内存开支,以及频仍的 GC 扫描和接纳,晋升了处置机能。堆外内存能够被准确地请求和开释,并且序列化的数据占用的空间能够被准确盘算,以是比拟堆内内存来讲下降了治理的难度,也下降了偏差。在默许情形下堆外内存并不启用,可经过设置 spark.memory.offHeap.enabled 参数启用,并由 spark.memory.offHeap.size 参数设定堆外空间的巨细。除了没有 other 空间,堆外内存与堆内内存的分别方法雷同,全部运转中的并发义务同享存储内存和履行内存。2.3 内存治理接口Spark 为存储内存和履行内存的治理供给了同一的接口——MemoryManager,统一个 Executor 内的义务都挪用这个接口的方式来请求或开释内存:清单 1 . 内存治理接口的重要方式//请求存储内存defacquireStorageMemory(blockId:BlockId,numBytes:Long,memoryMode:MemoryMode):Boolean//请求开展内存defacquireUnrollMemory(blockId:BlockId,numBytes:Long,memoryMode:MemoryMode):Boolean//请求履行内存defacquireExecutionMemory(numBytes:Long,taskAttemptId:Long,memoryMode:MemoryMode):Long//开释存储内存defreleaseStorageMemory(numBytes:Long,memoryMode:MemoryMode):Unit//开释履行内存defreleaseExecutionMemory(numBytes:Long,taskAttemptId:Long,memoryMode:MemoryMode):Unit//开释开展内存defreleaseUnrollMemory(numBytes:Long,memoryMode:MemoryMode):Unit

上一篇:浅谈正则表达式原理

下一篇:没有了

返回
版权信息Copyright © IT技术教程 版权所有    ICP备案编号:鲁ICP备09013610号