当前位置: 首页 > article >正文

关于spark在yarn上运行时候内存的介绍

在YARN上运行Spark时,内存管理是性能调优的核心环节。以下是 Driver MemoryExecutor Memory堆内存(Heap Memory)堆外内存(Off-Heap Memory) 的区别与配置方法,以及实际场景中的最佳实践:


1. 核心概念与区别

(1) Driver Memory
  • 角色:Driver是Spark应用程序的主控进程,负责:
    • 解析用户代码,生成DAG(任务执行计划)。
    • 调度Task到Executor,并监控执行状态。
    • 收集结果(如collect()操作)或广播变量。
  • 内存组成
    • 堆内存:存储元数据(如Task定义、广播变量)和收集的结果数据。
    • 堆外内存:JVM自身开销、直接内存(如网络传输缓存)。
  • 关键参数
    • spark.driver.memory:Driver的堆内存(默认1g)。
    • spark.driver.memoryOverhead:Driver的堆外内存(默认max(384MB, 0.1 * spark.driver.memory))。
(2) Executor Memory
  • 角色:Executor是工作节点上的任务执行进程,负责:
    • 执行具体的Task(如Map、Reduce操作)。
    • 缓存数据(如cache()persist())。
  • 内存组成
    • 堆内存:存储Task处理的数据、缓存的数据。
    • 堆外内存:Shuffle中间数据、原生操作(如HDFS读写缓存)。
  • 关键参数
    • spark.executor.memory:Executor的堆内存(默认1g)。
    • spark.executor.memoryOverhead:Executor的堆外内存(默认max(384MB, 0.1 * spark.executor.memory))。
    • spark.memory.fraction:Executor中用于计算和缓存的总内存占比(默认0.6)。
(3) 堆内存 vs 堆外内存
特性堆内存(Heap)堆外内存(Off-Heap)
管理方式由JVM垃圾回收器(GC)管理不受GC管理,需手动释放或依赖操作系统管理
存储内容Java对象实例(如RDD数据、集合)JVM元数据、直接缓冲区(DirectByteBuffer)、Shuffle临时文件
溢出风险OutOfMemoryError: Java heap spaceOutOfMemoryError: Direct buffer memory 或YARN/K8s容器被杀死
配置参数spark.driver.memoryspark.executor.memoryspark.driver.memoryOverheadspark.executor.memoryOverhead

2. 内存设置规则

(1) 总内存限制

在YARN集群中,Driver和Executor的内存需满足:

  • Driver总内存 ≤ YARN单容器内存上限(由yarn.scheduler.maximum-allocation-mb定义)。
  • Executor总内存 ≤ YARN单容器内存上限。

总内存计算公式:

Driver总内存 = spark.driver.memory + spark.driver.memoryOverhead
Executor总内存 = spark.executor.memory + spark.executor.memoryOverhead
(2) 配置建议
参数DriverExecutor说明
堆内存spark.driver.memoryspark.executor.memory- Driver:根据收集数据量和广播变量大小调整。
- Executor:根据分区数据量和缓存需求调整。
堆外内存spark.driver.memoryOverheadspark.executor.memoryOverhead- 默认值通常不足!若任务涉及大量Shuffle或Native操作,需手动增加。
内存分配比例-spark.memory.fraction调整Executor内计算内存(Execution)和缓存内存(Storage)的比例。
(3) 典型场景设置示例
  • 场景1:常规ETL任务

    spark-submit \--driver-memory 4g \--executor-memory 8g \--conf spark.executor.memoryOverhead=2g \--conf spark.driver.memoryOverhead=1g \...
    
    • 说明:Executor处理数据分区,预留2GB堆外内存应对Shuffle。
  • 场景2:需collect()大量数据

    spark-submit \--driver-memory 16g \           # 收集10GB数据时,Driver堆内存需足够大--conf spark.driver.maxResultSize=10g \...
    
    • 注意:避免collect(),优先使用分布式写入(如write.parquet())。
  • 场景3:机器学习(频繁Shuffle)

    spark-submit \--executor-memory 16g \--conf spark.executor.memoryOverhead=4g \  # Shuffle和原生库可能占用大量堆外内存--conf spark.memory.fraction=0.7 \         # 提高计算内存占比...
    

3. 常见问题与调优

(1) Driver OOM(堆内存不足)
  • 表现java.lang.OutOfMemoryError: Java heap space
  • 解决方案
    • 增加spark.driver.memory
    • 避免在Driver中收集大数据(用take(n)替代collect())。
    • 减少广播变量大小。
(2) Executor OOM(堆内存不足)
  • 表现:Executor日志中抛出堆内存溢出。
  • 解决方案
    • 增加spark.executor.memory
    • 减少单个分区的数据量(通过repartition()增大分区数)。
    • 使用MEMORY_AND_DISK缓存级别。
(3) 容器被YARN杀死(堆外内存不足)
  • 表现:YARN日志提示 Container killed due to exceeding memory limits
  • 解决方案
    • 增大spark.executor.memoryOverheadspark.driver.memoryOverhead
    • 检查是否使用Native库(如OpenBLAS)导致堆外内存泄漏。
(4) Shuffle阶段频繁溢写磁盘
  • 表现:Spark UI中Shuffle Write/Read量过大,任务变慢。
  • 解决方案
    • 增大spark.executor.memoryspark.memory.fraction(为Execution内存留更多空间)。
    • 优化数据倾斜(加盐、拆分倾斜Key)。

4. 最佳实践总结

配置项推荐策略
Driver堆内存根据collect()数据量设置,通常为数据量的2倍,不超过YARN容器上限。
Executor堆内存根据分区数据量设置,建议8g~16g,避免单个Executor内存过大导致GC停顿。
堆外内存至少为堆内存的20%~30%(如spark.executor.memoryOverhead=4g当Executor堆内存为16g)。
Shuffle优化增大spark.sql.shuffle.partitions(默认200)到2-3倍数据分区数。
监控工具使用Spark UI + YARN Web UI + Prometheus监控堆/堆外内存趋势。

5. 完整示例配置

spark-submit \--master yarn \--deploy-mode cluster \--driver-memory 8g \--executor-memory 16g \--conf spark.driver.memoryOverhead=2g \--conf spark.executor.memoryOverhead=4g \--conf spark.memory.fraction=0.7 \--conf spark.sql.shuffle.partitions=2000 \--conf spark.serializer=org.apache.spark.serializer.KryoSerializer \--class com.example.Main \/path/to/your-app.jar

通过合理分配堆内外内存、监控资源使用,并结合业务逻辑优化,可以显著减少Spark作业的OOM风险和性能瓶颈。

相关文章:

关于spark在yarn上运行时候内存的介绍

在YARN上运行Spark时,内存管理是性能调优的核心环节。以下是 Driver Memory、Executor Memory、堆内存(Heap Memory) 和 堆外内存(Off-Heap Memory) 的区别与配置方法,以及实际场景中的最佳实践&#xff1a…...

分布式系统面试总结:3、分布式锁(和本地锁的区别、特点、常见实现方案)

仅供自学回顾使用,请支持javaGuide原版书籍。 本篇文章涉及到的分布式锁,在本人其他文章中也有涉及。 《JUC:三、两阶段终止模式、死锁的jconsole检测、乐观锁(版本号机制CAS实现)悲观锁》:https://blog.…...

【VSCode的安装与配置】

目录: 一:下载 VSCode二:安装 VSCode三:配置 VSCode 一:下载 VSCode 下载地址:https://code.visualstudio.com/download 下载完成之后,在对应的下载目录中可以看到安装程序。 二:安装…...

ElasticSearch常用优化点

关闭交换分区:因为Linux采用了三级页表虚存管理,关闭交换分区可以减少系统IO,页面换入唤出时所耗费的总线时间以及减少系统中断次数;swap的使用会显著增加延迟和降低吞吐量。文件描述符配置:任何网络应用都需要增加文件…...

脱围机制-react18废除forwardRef->react19直接使用ref的理解

采用ref&#xff0c;可以在父组件调用到子组件的功能 第一步&#xff1a;在父组件声明ref并传递ref interface SideOptsHandle {refreshData: () > Promise<void> }const sideOptsRef useRef<SideOptsHandle>(null) // 创建 ref<SideOpts ref{sideOptsRef…...

Spark2 之 Expression/Functions

ExpressionConverter src/main/scala/org/apache/gluten/expression/ExpressionConverter.scala TopNTransformer src/main/scala/org/apache/gluten/execution/TopNTransformer.scala...

Windows中安装git工具

下载好git安装包 点击next 选择安装目录 根据需要去勾选 点击next 点击next PATH环境选择第二个【Git...software】即可&#xff0c;再点击【Next】。 第一种配置是“仅从Git Bash使用Git”。这是最安全的选择&#xff0c;因为您的PATH根本不会被修改。您只能使用 Git Bash 的…...

【CSS】CSS 使用全教程

CSS 使用全教程 介绍 CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;是一种样式表语言&#xff0c;用于描述 HTML 或 XML 文档的布局和外观&#xff0c;它允许开发者将文档的内容结构与样式表现分离&#xff0c;通过定义一系列的样式规则来控制网页…...

《HarmonyOS Next自定义TabBar页签凸起和凹陷案例与代码》

引言 自定义TabBar在HarmonyOS Next应用中很常见&#xff0c;本文将介绍如何实现页签的凸起和凹陷效果&#xff0c;并通过代码示例展示实现过程。 实现思路 基于已有的自定义TabBar思路&#xff0c;通过调整布局和样式实现凸起和凹陷效果。凸起效果可以通过在选中的页签下方…...

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练 1.2025新版懒人精灵-实战红果搜索关键词刷视频&#xff1a;https://www.bilibili.com/video/BV1eK9kY7EWV 2.懒人精灵-全分辨率节点识别&#xff08;红果看广告领金币小实战&#xff09;&#xff1a;https://www.bili…...

如何在IDEA中借助深度思考模型 QwQ 提高编码效率?

通义灵码上新模型选择功能&#xff0c;不仅引入了 DeepSeek 满血版 V3 和 R1 这两大 “新星”&#xff0c;Qwen2.5-Max 和 QWQ 也强势登场&#xff0c;正式加入通义灵码的 “豪华阵容”。开发者只需在通义灵码智能问答窗口的输入框中&#xff0c;单击模型选择的下拉菜单&#x…...

C++11QT复习 (四)

Day6-1 输入输出流运算符重载&#xff08;2025.03.25&#xff09; 1. 拷贝构造函数的调用时机 2. 友元2.1 友元函数 3. 输入输出流运算符重载3.1 关键知识点3.2 代码3.3 关键问题3.4 完整代码 4. 下标访问运算符 operator[]4.1 关键知识点4.2 代码 5. 函数调用运算符 operator…...

LVS的 NAT 模式实验

文章目录 目录 文章目录 概要 IP规划与题目分析 实验步骤 一、nginx配置&#xff08;rs1、rs2、rs3&#xff09; 二、LVS配置 三、客户端配置 四、防火墙和selinux配置 实验结果 痛点解答 概要 LVS/NAT lvs/nat网络地址转换模式&#xff0c;进站/出站的数据流量经过分发器(IP负…...

【MacOS】2025年硬核方法清理MacOS中的可清除空间(Purgeable space)

背景 MacOS使用一段时间之后&#xff0c;硬盘空间会越来越少&#xff0c;但自己的文件没有存储那么多&#xff0c;在储存空间中可以发现可用空间明明还剩很多&#xff0c;但磁盘工具却显示已满&#xff0c;见下图。 尝试解决 df -h 命令却发现磁盘已经被快被占满。使用du命…...

ue材质学习感想总结笔记

2025 - 3 - 27 1.1 加法 对TexCoord上的每一个像素加上一个值&#xff0c;如果加上0.1&#xff0c;0.1&#xff0c; 那么左上角原来0,0的位置变成了0.1,0.1 右上角就变成了1.1,1.1&#xff0c;那么原来0,0的位置就去到了左上角左上边&#xff0c;所以图像往左上偏移。 总而言…...

Go 语言 sync 包使用教程

Go 语言 sync 包使用教程 Go 语言的 sync 包提供了基本的同步原语&#xff0c;用于在并发编程中协调 goroutine 之间的操作。 1. 互斥锁 (Mutex) 互斥锁用于保护共享资源&#xff0c;确保同一时间只有一个 goroutine 可以访问。 特点&#xff1a; 最基本的同步原语&#x…...

约束文件SDC常用命令

约束文件SDC常用命令 定义时钟create_clock -name CLK-period 2 [get_ports_clk]告诉工具主时钟周期是2ns(频率500MHz),从clk端口输入 输入信号延迟set_input_delay 0.5 -clock CLK [get_ports data_in]数据进芯片前,外部电路已消耗0.5ns,综合要预留这段“堵车时间”。 输出…...

信而泰PFC/ECN流量测试方案:打造智能无损网络的关键利器

导语&#xff1a; AI算力爆发的背后&#xff0c;如何保障网络“零丢包”&#xff1f; 在当今数据中心网络中&#xff0c;随着AI、高性能计算&#xff08;HPC&#xff09;和分布式存储等应用的飞速发展&#xff0c;网络的无损传输能力变得至关重要。PFC&#xff08;基于优先级的…...

golang不使用锁的情况下,对slice执行并发写操作,是否会有并发问题呢?

背景 并发问题最简单的解决方案加个锁,但是,加锁就会有资源争用,提高并发能力其中的一个优化方向就是减少锁的使用。 我在之前的这篇文章《开启多个协程,并行对struct中的每个元素操作,是否会引起并发问题?》中讨论过多协程场景下struct的并发问题。 Go语言中的slice在…...

Android 底部EditView输入时悬浮到软键盘上方

1. 修改 Activity 的 Manifest 配置 确保你的 Activity 在 AndroidManifest.xml 中有以下配置&#xff1a; <activityandroid:name".YourActivity"android:windowSoftInputMode"adjustResize|stateHidden" /> 关键点&#xff1a; adjustResize 是…...

CNN和LSTM的计算复杂度分析

前言&#xff1a;今天做边缘计算的时候&#xff0c;在评估模型性能的时候发现NPU计算的大部分时间都花在了LSTM上&#xff0c;使用的是Bi-LSTM&#xff08;耗时占比98%&#xff09;&#xff0c;CNN耗时很短&#xff0c;不禁会思考为什么LSTM会花费这么久时间。 首先声明一下实…...

UniApp 表单校验两种方式对比:命令式与声明式

目录 前言1. 实战2. Demo 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 以下主要针对Demo讲解&#xff0c;从实战中的体会 何为命令式 何为声明式 命令式的体验&#xff0c;随时都会有提交的按钮&#xff…...

【树莓派Pico FreeRTOS】-Mutex(互斥体)

Mutex(互斥体) 文章目录 Mutex(互斥体)1、硬件准备2、软件准备3、FreeRTOS的Mutex介绍4、完整示例RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 RAM,并支持高达 16MB 的片外闪存。 广泛的灵活 I/O 选项包括 I2C、SPI 和独特的可编程 I/O (P…...

LCR 187. 破冰游戏(python3解法)

难度&#xff1a;简单 社团共有 num 位成员参与破冰游戏&#xff0c;编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target&#xff0c;从 0 号成员起开始计数&#xff0c;排在第 target 位的成员离开圆桌&#xff0c;且成员离开后从下一个成员开始计数…...

【漏洞修复】为了修复ARM64 Android10系统的第三方库漏洞,将ARM64 Android16的系统库直接拷贝到Android10系统如何?

直接替换系统库的风险分析 将高版本Android&#xff08;如Android 16&#xff09;的系统库直接拷贝到低版本系统&#xff08;如Android 10&#xff09;可能会导致以下问题&#xff1a; 符号与依赖不兼容 高版本库可能依赖更高版本的NDK或Bionic libc&#xff08;Android的C库&…...

Flutter环境配置

配置环境变量 PUB_HOSTED_URLhttps://pub.flutter-io.cnFLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn 这个命令是用来配置 Flutter 的镜像源地址&#xff0c;主要是为了解决在中国大陆地区访问 Flutter 官方资源较慢的问题。 具体的操作如下&#xff1a; 右键点…...

centOS 7.9 65bit 修复Openssh漏洞

一、背景&#xff1a; 在使用centos 7.9 64bit版本操作系统时有扫描出如下的漏洞&#xff1a; 二、修复openssh漏洞操作 升级注意事项 (一下所有的操作默认都是root或者管理员权限&#xff0c;如果遇到权限问题每个指令以及指令组合都要在前面加sudo) 1、查看CentOS操作系统信…...

金融级密码管理器——生物特征密钥绑定方案

目录 金融级密码管理器 —— 生物特征密钥绑定方案一、模块概述与设计目标1.1 模块背景与意义1.2 设计目标二、系统架构设计2.1 系统模块划分2.2 系统架构图(Mermaid示意图)三、核心算法与安全原理3.1 生物特征数据预处理3.2 密钥生成算法3.3 安全认证与密钥绑定验证3.4 密钥…...

JDBC-添加数据

文章目录 准备数据库添加数据引入数据库依赖包 准备数据库 自行安装软件&#xff0c;利用小皮内嵌的数据 添加数据 引入数据库依赖包 结构 drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://127.0.0.1:3308/yanyuuserroot passwordrootpackage com.yanyu;import java.sql.*;…...

衡石科技HENGSHI SENSE异构数据关联技术深度解析:揭秘5-8倍性能提升背后的“异构过滤“架构

引言&#xff1a;多源数据关联的行业痛点 在大数据时代&#xff0c;企业数据通常分散在多个异构系统中——关系型数据库、NoSQL、数据仓库、湖仓一体平台等。根据Forrester调研&#xff0c;超过78%的企业需要同时访问5种以上不同类型的数据源进行分析&#xff0c;但传统ETL和跨…...