spark~内存模型

spark内存模型

内存模型

在这里插入图片描述
1、ExecutionMemory用来计算shuffles、joins、sorts和aggregations
2、Storage不是一个真的内存工具,它只是把内存作为他的LRU缓存,Storage默认情况下占executor.memory的54%,用于缓存和传播跨集群的内部数据
3、unroll部分内存: spark.storage.unrollFraction。当我们需要在内存展开数据块的时候使用,那么为什么需要展开呢?因为spark允许以序列化和非序列化两种方式存储数据,序列化后的数据无法直接使用,所以使用时必须要展开。该部分内存占用缓存的内存,所以如果需要内存用于展开数据时,如果这个时候内存不够,那么Spark LRU缓存中的数据会删除一些快。
4、MemoryManager有两种内存管理模型
StaticMemoryManager:一个硬性的边界在存储和执行内存中 通过静态给spark内存分区,阻止存储和执行互相借用内存,这种模式已过时,保留只是为了兼容性
UnifiedMemoryManager:联合内存的概念,最主要的改变是存储和运行的空间可以动态移动。需要注意的是执行比存储有更大的优先值。Execution 可以强制把 Storage 一部份空间挤掉。Excution 向 Storage 借空间有两种方式:第一种方式是 Storage 曾经向 Execution 借了空间,它缓存的数据可能是非常的多,当 Execution 需要空间时可以强制拿回来;第二种方式是 Execution Memory 不足 50% 的情况下,Storgae Memory 会很乐意地把剩馀空间借给 Execution。
5、User Memory:写 Spark 程序中产生的临时数据或者是自己维护的一些数据结构也需要给予它一部份的存储空间,你可以这么认为,这是程序运行时用户可以主导的空间,叫用户操作空间。它占用的空间是 (Java Heap - Reserved Memory) x 25% (默认是25%,可以有参数供调优),这样设计可以让用户操作时所需要的空间与系统框架运行时所需要的空间分离开。假设 Executor 有 4G 的大小,那么在默认情况下 User Memory 大小是:(4G - 300MB) x 25% = 949MB,也就是说一个 Stage 内部展开后 Task 的算子在运行时最大的大小不能够超过 949MB。例如工程师使用 mapPartition 等,一个 Task 内部所有算子使用的数据空间的大小如果大于 949MB 的话,那么就会出现 OOM。思考题:有 100个 Executors 每个 4G 大小,现在要处理 100G 的数据,假设这 100G 分配给 100个 Executors,每个 Executor 分配 1G 的数据,这 1G 的数据远远少于 4G Executor 内存的大小,为什么还会出现 OOM 的情况呢?那是因为在你的代码中(e.g.你写的应用程序算子)超过用户空间的限制 (e.g. 949MB),而不是 RDD 本身的数据超过了限制。

如果是你的计算比较复杂的情况,使用新型的内存管理 (Unified Memory Management) 会取得更好的效率,但是如果说计算的业务逻辑需要更大的缓存空间,此时使用老版本的固定内存管理 (StaticMemoryManagement) 效果会更好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark内存模型是指Spark内存中管理和处理数据的方式。Spark使用了一种称为弹性分布式数据集(Resilient Distributed Dataset,简称RDD)的数据结构来表示和操作数据。 RDD是一个可分区、可并行计算的数据集合,它可以在集群中的多个节点上进行并行处理。RDD的特点是不可变性和容错性,即RDD的数据是只读的,一旦创建就不能修改,同时RDD会自动记录数据的血统信息,以便在节点故障时进行恢复。 Spark内存模型主要包括以下几个部分: 1. Driver:驱动器是Spark应用程序的主要控制节点,负责整个应用程序的调度和协调工作。驱动器程序会将应用程序划分为一系列的任务,并将这些任务分发给集群中的工作节点进行执行。 2. Executor:执行器是运行在集群中的工作节点上的进程,负责执行驱动器分发的任务。每个执行器都有自己的JVM进程,并且可以同时运行多个任务。执行器通过与驱动器通信来接收任务,并将任务结果返回给驱动器。 3. RDD:RDD是Spark中的核心数据结构,它代表了一个可分区、可并行计算的数据集合。RDD可以从外部数据源创建,也可以通过对其他RDD进行转换操作得到。RDD的数据可以被分区存储在内存中,以便并行处理。 4. 分区:RDD的数据可以被划分为多个分区,每个分区都是一个独立的数据片段。分区是Spark并行计算的基本单位,每个分区可以在一个执行器上进行处理。分区的数量决定了并行计算的程度。 5. 内存管理:Spark使用内存来缓存RDD的数据,以便加速后续的计算操作。Spark提供了两种类型的内存管理方式:堆内存和堆外内存。堆内存用于存储RDD的元数据和执行过程中的临时数据,而堆外内存则用于缓存RDD的数据分区。 6. 数据共享:Spark通过共享RDD的方式来实现数据的复用和传递。当一个RDD被多个任务使用时,Spark会将该RDD的数据分区复制到各个任务所在的执行器上,以便并行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值