spark内存模型

2023-11-18

Spark 1.6 开始使用了统一内存管理模块(UnifiedMemoryManager),并引入了堆外内存(Off-heap memory),1.6之前的内存管理就不进行介绍了。

spark堆内和堆外内存模型的示意图

(注意:堆外内存是依赖于worker的,而不是executor)

spark堆外(之所以叫spark堆外,是因为后续要和jvm堆外进行区别,也是大家容易弄混淆的地方),为了进一步优化内存的使用以及提高 Shuffle 时排序的效率,Spark 引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间。Spark 可以直接操作堆外内存,减少了不必要的内存开销,以及频繁的 GC 扫描和回收,提升了处理性能。堆外内存可以被精确地申请和释放,而且序列化的数据占用的空间可以被精确计算,所以相比堆内内存来说降低了管理的难度,也降低了误差。

在默认情况下堆外内存并不启用,可通过配置 spark.memory.offHeap.enabled 参数启用,并由 spark.memory.offHeap.size 参数设定堆外空间的大小。除了没有 other 空间,堆外内存与堆内内存的划分方式相同,所有运行中的并发任务共享存储内存和执行内存。

堆外内存由于默认不开启堆外内存,以及笔者没有使用堆外内存的客观收益证明,这里不进行详细讨论

spark堆内spark 堆内内存就是spark提交给jvm管理的那部分内存(与直接操作系统内存对应),spark 对堆内内存的管理是一种逻辑上的"规划式"的管理,因为对象实例占用内存的申请和释放都由 JVM 完成,Spark 只能在申请后和释放前记录这些内存。这也是为什么堆内占用没法被精确计算(非序列化的对象),以及内存使用情况无法精确得知(无法清楚得知jvm的GC情况)的原因。

spark堆内内存模型示意图

如图所示,spark.{executor/driver}.memory参数来设置堆内存, spark.yarn.{executor/driver}.memoryOverhead 来设置堆外内存。

(注意:这里的memoryOverhead所指的堆外内存是jvm控制的堆外内存,与上面说的spark堆外内存不是一回事)

由于executor和driver的内存模型结构相同,这里以executor为例来进行说明

Execution 内存:主要用于存放 Shuffle、Join、Sort、Aggregation 等计算过程中的临时数据

Storage 内存:主要用于存储 spark 的 cache 数据,例如RDD的缓存、unroll数据;

用户内存(User Memory):主要用于存储 RDD 转换操作所需要的数据,例如 RDD 依赖等信息,对于sparkSQL而言还有UDF的内存占用。注意:这部分数据无法spill到磁盘,如果不够就会OOM

预留内存(Reserved Memory):系统预留内存,会用来存储Spark内部对象。

(注意:公司集群中,spark.memory.fraction的默认值是0.3)

jvm堆外内存的模型

其中堆外内存的Execution和Storage作用和堆内内存相同

参数调优指南(Spark内存模型以及调参建议

(注意:executor的内存溢出绝大多数情况是由于数据倾斜,所以优先要解决数据倾斜的问题,参数的调优只是在非数据倾斜下才有明显收益)

出错点

表现

建议

Executor 堆内存不足

在XT的测试日志或者Spark Driver日志中发现Executor的退出码为143:“Exit status: 143”,例如:

Diagnostics: Container killed on request. Exit code is 143

Container exited with a non-zero exit code 143

Killed by external signal

  1. 如果executor-cores 比较大(>2), 首先减小executor-cores

  2. 如果executor-cores 比较小,增大spark.executor.memory

在XT测试日志或者SparkUI中发现如下日志“Executor heartbeat timed out”,例如:

ExecutorLostFailure(executor 923 exited caused by one of the running tasks) Reason: Executor heartbeat timed out after 167123 ms

Executor 堆外内存不足

在XT测测试日志或者Spark UI中出现“Consider boosting spark.yarn.executor.memoryOverhead”,例如

ExecutorLostFailure (executor 29 exited caused by one of the running tasks)

Reason: Container killed by YARN for exceeding memory limits. 3.1 GB of 3 GB physical memory used.

Consider boosting spark.yarn.executor.memoryOverhead.

  1. 如果executor-cores 比较大(>2), 首先减小executor-cores

  2. 如果executor-cores 比较小,增大

    spark.yarn.executor.memoryOverhead

Driver内存不足

XT测试日志中频繁出现“WARN Client: Fail to get RpcResponse: Timeout”

  1. 怀疑大表被广播,检查一下是否有将spark.sql.autoBroadcastJoinThreshold设置比较大,或者对大表加了广播的hint(mapjoin、broadcast)

  2. 检查是否向Driver collect大量数据

  3. 增大spark.driver.memory

JobSearch 出现“Application application_1556014017728_7970183 failed 1 times due to ApplicationMaster for attempt appattempt_1556014017728_7970183_000001 timed out. Failing the application.”, 例如

Driver压力大,不能及时响应Executor的心跳信息

ExecutorLostFailure (executor 696 exited caused by one of the running tasks) Reason: Container marked as failed: container_e17_1560590242140_874934_01_000898 on host: zw02-data-hdp-dn6412.gh.sankuai.com. Exit status: 56.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spark内存模型 的相关文章

  • 为什么调用 take() 方法时 Slick 会生成子查询

    I use Slick http slick typesafe com 1 0 0 RC1 我对表对象有这样的定义 object ProductTable extends Table Int String String String Dou
  • IntelliJ IDEA Scala 插件问题

    我对新的 Intellij IDEA 10 和 Scala 插件有疑问 当我在 Scala 源文件中输入任何内容时 编辑器会永久冻结 在其他文件 java 和其他 编辑器中效果很好 结构视图 scala 检查和显示成员功能已关闭 堆大小增加
  • 如何检查字符串中是否包含某个字符?

    我想检查字符串是否包含该字符 我正在编写一个刽子手代码 例如 下面是要猜测的单词 scala 但看起来像 至用户 假设用户输入字母 a 那么它一定看起来像 a a def checkGuess if result contains user
  • Scala:在运行时获取 mixin 接口

    我需要在运行时从给定的类获取所有接口 全部加载在类加载器中 例如 如果一个类是这样声明的 trait B trait C trait D class A extends B with C with D 我想在运行时获取这些信息 A 取决于
  • Scala 性能问题

    In the 丹尼尔 科泽夸 Daniel Korzekwa 撰写的文章 http blog danmachine com 2011 01 moving from java to scala one year html 他说以下代码的性能
  • Scala - 如何解决“值不是 Nothing 的成员”错误

    此示例代码基于 Atmosphere 类 但如果有人可以让我了解该错误的一般含义 我想我可以找出任何特定于 Atmosphere 的解决方案 val bc BroadcasterFactory getDefault lookup broad
  • scala/spark 代码不允许在 hive 中添加列

    如果源数据有新列 我尝试在 Hive 表中添加一列 所有新列的检测都运行良好 但是 当我尝试将列添加到目标表时 我收到此错误 for f lt df schema fields if f name chk spark sqlContext
  • Scala 集合不一致

    为什么 Scala Collections API 中的集合和列表之间缺乏一致性 例如 有不可变的 Set 但也有可变的 Set 如果我想使用后者 我可以简单地这样做 val set Set A set new A 但是 本身不存在可变列表
  • Scala:具有复杂结构的树插入尾递归

    我正在 scala 中创建自定义对象树 并且我的插入方法引发堆栈溢出 因为它不是尾递归 但是 我不太清楚如何使其尾递归 我见过使用 累加器 变量的相关示例 但它们要么是只能相乘和覆盖的整数之类的东西 要么是我在适应树时遇到困难的列表 这是我
  • 使用原始类型模拟案例类

    考虑以下类型结构 trait HasId T def id T case class Entity id Long extends HasId Long 比方说 我们想在一些测试中模拟实体类 val entityMock mock Enti
  • 使用 Akka 玩 2.5 - 找不到参数超时的隐式值:akka.util.Timeout

    我正在尝试使用 Play 2 5 测试 Akka 但遇到了一个似乎无法解决的编译错误 我正在关注 Play 文档中的此页面 https playframework com documentation 2 5 x ScalaAkka http
  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN
  • 缓存 Slick DBIO 操作

    我正在尝试加快 SELECT FROM WHERE name 的速度Play 中的查询类型 Scala 应用程序 我正在使用 Play 2 4 Scala 2 11 play slick 1 1 1 包 该软件包使用Slick 3 1版本
  • 类型级编程有哪些示例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不明白 类型级编程 是什么意思 也无法使用Google找到合适的解释 有人可以提供一个演示类型级编程的示例吗 范式的解释和 或定义将
  • 使用 scala 在 Flink 中进行实时流预测

    弗林克版本 1 2 0斯卡拉版本 2 11 8 我想使用 DataStream 来使用 scala 中的 flink 模型进行预测 我在使用 scala 的 flink 中有一个 DataStream String 其中包含来自 kafka
  • 玩:将表单字段绑定到双精度型?

    也许我只是忽略了一些明显的事情 但我无法弄清楚如何将表单字段绑定到 Play 控制器中的双精度型 例如 假设这是我的模型 case class SavingsGoal timeframeInMonths Option Int amount
  • Scalatest PlusPlay Selenium 无法调整窗口大小

    对此已经研究了一段时间 我似乎找不到使用 scalatest plus 调整窗口大小的方法 我发现在线搜索或文档的唯一方法http doc scalatest org 2 1 5 index html org scalatest selen
  • 如何定义与更高类型类型(类型构造函数)绑定的上下文

    我尝试过以下方法 def test Option T Ordering value1 Option T value2 Option T val e implicitly Ordering Option T compare value1 va
  • 按字符分割字符串

    scala 有一个标准的分割字符串的方法StringOps split 但它的行为有点让我惊讶 演示一下 使用快捷便利功能 def sp str String str split toList 以下表达式全部计算结果为 true sp Li
  • scala中的协变类型参数需要在java接口中保持不变

    我有一个看起来像这样的特征 一些进一步的信息可以在我自己提出了这个相关问题 https stackoverflow com questions 3695990 inheritance and automatic type conversio

随机推荐

  • 【数据结构】排序(直接插入、折半插入、希尔、冒泡、快速、直接选择、堆、归并、基数排序)

    一 什么是排序 排序 将一组杂乱无章的数据按一定规律顺次排列起来 即 将无序序列的数据节点包含多个数据域 那么排序往往是针对其中某个域而言 二 排序方法的分类 1 按数据存储介质可分为 内部排序 数据量不大 数据在内存 无需内外存交换数据
  • SQL抽取数据脚本

    sp OutputData IF EXISTS SELECT 1 FROM sys objects o WHERE object id object id N sp OutputData AND OBJECTPROPERTY object
  • vue数据劫持 ajax,Vue视图更新原理 - 数据劫持,最小量更新和DIFF算法

    什么是数据劫持 加入有一个js文件内容如下 var obj x 100 y 200 Object defineProperties obj x set console log You gonna update x the vision wi
  • python smtp发送邮件 附件 中文名乱码 问题

    重点 mime add header Content Disposition attachment filename make header file name UTF 8 encode UTF 8 完整代码可以发送多个附件 import
  • 20220801:强改jar包的一下经历

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 改jar包内容 二 使用步骤 1 首先是修改的class文件 2 如何替换jar包中的class文件 总结 前言 目标是一个dubbo的服务 我们的工程引
  • VS2008错误Error spawning 'cmd.exe'的解决方法

    解决方法 In the Options go into Projects and Solutions gt VC Directories page and place this rows SystemRoot System32 System
  • Redisson配置类

    学习记录 Redisson配置类 Bean public RedissonClient redissonClient throws IOException ResourceLoader loader new DefaultResourceL
  • Dell台式机重装win 10系统之后开机报错

    电脑品牌 戴尔 报错信息 Hard disk dirve failure 硬盘驱动器故障 trick the F1 key to continue F2 to run the setup utility 报错原因 电脑一开机出现黑屏并出现H
  • Spring面向切面编程-AOP

    前言 在软件开发中 面向切面编程 Aspect Oriented Programming AOP 是一个非常重要的编程范式 Spring AOP是Spring框架提供的AOP实现 在Spring中使用AOP实现企业应用开发已经非常普遍 本文
  • 测试基础-静态白盒测试(检查代码)

    1 静态白盒测试 检查设计和代码 静态测试 测试非运行部分 检验和审查 白盒测试 访问代码 能够查看和审查 静态白盒测试 在不执行软件的条件下有条理地仔细审查软件设计 体系结构和代码 从而找出软件缺陷的过程 有时称为结构化分析 2 正式审查
  • yolov7运行自己的VOC格式数据集

    yolov7运行VOC格式数据集 代码下载 测试开发环境 使用自己的VOC格式数据集训练 修改配置文件yolov7 yaml 修改配置文件voc yaml VOC格式数据集转换COCO格式 开始训练 重头开始 fine train BUG
  • 【手写一个RPC框架】simpleRPC-03

    目录 前言 实现 项目创建 依赖配置 common service client server 文件结构 运行 本项目所有代码可见 https github com weiyu zeng SimpleRPC 前言 我们将新写一个服务接口 通
  • Ugly Numbers

    题目描述 Ugly numbers are numbers whose only prime factors are 2 3 or 5 The sequence 1 2 3 4 5 6 8 9 10 12 shows the first 1
  • 【深度学习】从LeNet-5识别手写数字入门深度学习

    活动地址 CSDN21天学习挑战赛 目录 LeNet模型 搭建环境 安装需要的包 创建工程 数据集 相关代码 可以设置GPU训练 默认CPU 通过TensorFlow下载数据集 对数据进行归一化处理 最值归一化 normalization
  • kvm创建快照与还原

    对k8s m1虚拟机创建快照 virsh snapshot create as k8s m1 20190317 查看虚拟机镜像快照的版本 virsh snapshot list k8s m1 或者 qemu img info opt kvm
  • Qt信号与槽

    信号与槽是Qt编程的基础 信号与槽在Qt中处理界面各个组件的交互操作时变得更加的直观和简单 信号 信号 Signal 就是在特定情况下被发射的事件 GUI程序设计的主要内容就是对界面上各个组件的信号进行响应 只需要知道什么情况下发射哪些信号
  • Vim配置#Vim插件安装#NERDTree配置

    一 centos系统的Vim安装 普通用户下输入命令 yum y install vim 之后输入y 即可等待安装完成 二 Vim的配置 如果你需要配置vim 只需在Home目录创建一个 vimrc文件即可以配置vim了 如需安装插件 在
  • mybatis ----数据级联查询(多对一)

    工程的目录结构 有两个表 一个文章表article 一个用户表user create table article id int 11 not null auto increment userid int 11 not null title
  • vscode连接github

    此次采用ssh方式 分为以下几步 目录 1 生成公钥 配置到github 2 在本地建立仓库 推送到本地的master分支 3 在github建立仓库 复制ssh 进行推送 一 生成公钥 本地生成公钥和私钥 将公钥配置到github中 通过
  • spark内存模型

    Spark 1 6 开始使用了统一内存管理模块 UnifiedMemoryManager 并引入了堆外内存 Off heap memory 1 6之前的内存管理就不进行介绍了 spark堆内和堆外内存模型的示意图 注意 堆外内存是依赖于wo