Spark性能调优(九)之Spark Tungsten内存使用

Spark Tungsten(钨丝计划)内存详解 一:Tungsten中到底什么是Page? 1. 在Spark其实不存在Page这个类的。Page是一种数据结构(类似于Stack,List等),从OS层面上讲,Page代表了一个内存块,在Page里面可以存放数据,在OS中会存放很多不同的Page,当要获得数据的时候首先要定位具体是哪个Page中的数据,找到该Page之后从Page中根据特定的规则(例如说数据的offset和length)取出数 阅读详情

一:Tungsten中到底什么是Page?
1.在Spark其实不存在Page这个类的。Page是一种数据结构(类似于Stack,List等),从OS层面上讲,Page代表了一个内存块,在Page里面可以存放数据,在OS中会存放很多不同的Page,当要获得数据的时候首先要定位具体是哪个Page中的数据,找到该Page之后从Page中根据特定的规则(例如说数据的offset和length)取出数据。
到底什么是Spark中的Page呢?
在阅读源码的时候,细致研究MemoryBlock.Java,MemoryBlock代表了一个Page的对象。
2.其中:Nullable:可以为空。为什么?Page代表了具体的内存区域以及内存里面具体的数据,Page中的数据可能是On-heap的数据,也可能是Off-heap中的数据。如果是On-heap则有对象,但是Off-heap的话就没有对象。所以用@Nullable,将对象设置为空。
其中offset:偏移量。MemoryBlock封装了Off-heap和On-heap。

public MemoryBlock(@Nullable Object obj, long offset, long length) {
  super(obj, offset);
  this.length = length;
}

3.On-heap和Off-heap寻址方式:
On-heap:先找到对象,然后再找索引。
Off-heap:根据地址找到索引。
4.Page可以定位到数据,然后又知道数据的偏移量OffSet之后怎么访问数据?这时候需要length,但是length并不知道,所以此时的长度设定为固定的,设置固定长度的length。
二:如何使用Page?
1.在TaskMemoryManager中,通过封装Page来定位数据,定位的时候如果是On-heap的话,则先找到对象,然后对象中通过offset来具体定位地址,而如果是Off-heap的话,则直接定位。
这里写图片描述

逻辑地址:Pagenumber由13个bit组成,51bit组成Offset
如果是On-heap的方式:内存的分配是是由heapMemoryAllocator完成的

@Override
public MemoryBlock allocate(long size) throws OutOfMemoryError {
  if (shouldPool(size)) {
    synchronized (this) {
      final LinkedList<WeakReference<MemoryBlock>> pool = bufferPoolsBySize.get(size);
      if (pool != null) {
        while (!pool.isEmpty()) {
          final WeakReference<MemoryBlock> blockReference = pool.pop();
          final MemoryBlock memory = blockReference.get();
          if (memory != null) {
            assert (memory.size() == size);
            return memory;
          }
        }
        bufferPoolsBySize.remove(size);
      }
    }
  }
//内存对齐,array里面都是地址,因为GC的时候对象的地址会发生变化,因此就需要
//为了获得对象的引用。也就是对象的地址。
  long[] array = new long[(int) ((size + 7) / 8)];
//array里面保存的都是地址,而LONG_ARRAY_OFFSET是偏移量,因此二者就可以定位到绝对地址,然后根据size就可以确定数据。
  return new MemoryBlock(array, Platform.LONG_ARRAY_OFFSET, size);
}

如果是Off-heap的方式:内存的分配是是由UnsafeMemoryAllocator完成的。

@Override
public MemoryBlock allocate(long size) throws OutOfMemoryError {
  long address = Platform.allocateMemory(size);
//对象的引用为null
//address是绝对地址
  return new MemoryBlock(null, address, size);
}

2.一个关键的问题是如何确定数据呢?这个时候就需要涉及具体的算法。
针对Task是怎么管理内存的?
TaskMemoryManager基于Page的概念屏蔽掉了底层是On-heap或者是Off-heap的概念,使用逻辑地址做指针,通过逻辑地址来具体定位到我们的记录具体在Page中的位置,
逻辑地址的表示:long类型的64bit的一个数字来表示的。
这里写图片描述

Spark钨丝计划:让火花(Spark)更接近灯丝(Rare Metal)详解(1) 本文主要包括如下几个内容: 1,钨丝计划 产生根本背景 2,钨丝计划的内幕详解一:钨丝计划是从Spark项目成立以来,对Spark执行引擎最大一次改进。它关注于为Spark应用从本质上提升内存和CPU的效率,从而将性能推进到接近现代硬件的极限。这次改进主要包括以下3个举措:**1,内存管理和二进制处理:借助应用的语义,显式管理内存,消除JVM对象模型和垃圾回收的开销 3,缓存感知计算:充分利用 阅读详情

相关推荐

Spark钨丝计划:让火花(Spark)更接近灯丝(Rare Metal)详解(2)

本文主要内容包括 : “钨丝计划”的shuffle的使用一:使用Tungsten功能 1, 如果想让您的程序使用Tungsten的功能,可以配置: Spark.Shuffle.Manager = tungsten-sort 2, DataFrame中自动开启了Tungsten功能。二:Tungsten-sort base Shuffle writer内幕 1,写数据在内存足够大的情况下

吾心光明 1527

第五十一讲 Spark优化之“钨丝计划”

第四十八讲  序列化和JVM性能调优 http://blog.sina.com.cn/s/blog_9ca9623b0102w8kp.html 第四十八讲  序列化和JVM性能调优 一:Spark性能调优之序列化 1,  之所以进行序列化,最重要的原因是内存空间有限(减少GC的压力,最大化的避免Full GC的产生,因为一旦产生Full GC则整个Task处于停

Make progress step by step everyday..... 2339

Spark性能调优实战--精华总结-极客时间 吴磊

spark和mapReduce的区别 MapReduce 计算模型最大的问题在于,所有操作之间的数据交换都以磁盘为媒介。例如,两个 Map 操作之间的计算,以及 Map 与 Reduce 操作之间的计算都是利用本地磁盘来交换数据的。 spark是两个 Map 操作之间的计算利用本地内存交换数据, Map 与 Reduce 操作之间的计算利用本地磁盘来交换数据的。 2.性能调优的本质 3.RDD:弹性分布式数据集 RDD 作为 Spark 对于分布式数据模型的抽象,是构建 Spark 分布式内存计算引擎的基

紫蝶侠的博客 7757

Spark性能优化第七季之Spark 钨丝计划

一:“钨丝计划”产生的本质原因1,Spark作为一个一体化多元化的(大)数据处理通用平台,性能一直是其根本性的追求之一,Spark基于内存迭代(部分基于磁盘迭代)的模型极大的满足了人们对分布式系统处理性能的渴望,但是有Spark事采用Scala+Java语言编写的所以运行在JVM平台,当然JVM是一个绝对伟大的平台,因为JVM让整个离散的主机融为一体(网络即OS),但是JVM的死穴GC反过来限制了S

sundujing的博客 3919

Spark 中的Tungsten和Catalyst

spark内核的三大核心:基于RDD的调度系统、Tungsten和Catalyst解析优化引擎TungstenTungsten面对: Memory , CPU, Disk IO 和 NetWork IOspark 1.6是第一阶段面对Memory, spark 2.0的时候面对的是CPU磁盘IO和网络IO主要发生在Shuffle阶段,Shuffle有Hash, Sort, Tungsten。默认是S

pofengliuming的专栏 3999

spark-Catalyst 优化器和 Tungsten 执行引擎介绍

Catalyst 是Spark SQL 的查询优化框架,负责将用户的 SQL 查询或者 DataFrame 操作转换成高效的执行计划。它是一个基于规则的、可扩展的查询优化器。Tungsten 是 Spark SQL 的底层执行引擎,专注于提升物理执行阶段的性能。它主要通过内存管理和代码生成技术,极大提高了 Spark SQL 的执行效率。组件作用范围主要功能Catalyst 优化器查询计划层面(逻辑计划和物理计划优化)SQL 解析、语义分析、逻辑优化、物理计划生成和选择Tungsten 执行引擎。

认真学代码的shell 1508

Spark 性能调优的黄金法则总结

Spark性能调优黄金法则摘要(150字版) 减少Shuffle:优先广播小表,用reduceByKey替代groupByKey,coalesce代替repartition。 优化Shuffle:调整分区数(spark.sql.shuffle.partitions),启用Kryo序列化,压缩数据。 内存管理:合理分配堆内/堆外内存,选择缓存级别(如MEMORY_ONLY_SER),优化数据结构减少GC。 并行度:确保分区数≥集群总核心数,动态调整避免数据倾斜。 解决倾斜:加盐打散Key,分离处理倾斜数据,或

csdn_tom_168的博客 1215

Spark分布式内存计算框架-07 深入剖析 Spark SQL 架构与调优:执行流程、Catalyst机制与性能优化

Spark SQL是Spark生态中重要的内存计算模块,其架构基于Catalyst优化器和Tungsten执行引擎,支持SQL和DSL语法。执行流程分为SQL解析(使用ANTLR4生成语法树)、逻辑计划分析(绑定元数据)、逻辑优化(应用规则优化)、物理计划生成(转换为可执行计划)和代码生成(编译为字节码)五个阶段。通过具体案例展示了SQL语句从解析到执行的全过程,体现了Spark SQL如何将高级查询转换为分布式计算任务。该框架通过分层优化显著提升了大数据处理的效率和易用性。

yangwei2048的博客 1766

Spark RDD 及性能调优

RDD(弹性分布式数据集)是Spark的核心抽象,支持容错和并行计算。其架构包括分区、计算函数、依赖关系、分区器及优先位置等关键组件。操作分为转换(Transformations)与行动(Actions),提供丰富的API支持复杂数据处理。 执行模型涵盖用户代码到分布式执行的全流程,通过DAG调度优化任务划分与资源分配。内存管理机制动态调整存储与执行内存,提升资源利用率。 性能调优涉及资源配置、执行引擎优化及数据处理策略。Catalyst优化逻辑计划,Tungsten提高运行效率,而合理分区与缓解数据倾

m13299531475的博客 1282

spark-AQE/Tungsten介绍及其触发条件

定义:Spark 3.0引入的自适应查询优化技术运行时动态调整执行计划。核心能力动态分区合并:自动合并小分区以减少Shuffle数据量。自动Broadcast Join:根据数据量动态切换Join策略。Skew Join优化:识别数据倾斜并自动调整分区策略。配置参数Tungsten(钨丝计划)定义:Spark 1.6推出的底层性能优化框架,通过内存管理和代码生成提升效率。关键技术内存列式存储:减少内存占用并提升缓存利用率。代码生成(Codegen):动态生成JVM字节码替代解释执行。

认真学代码的shell 1787

别再魔改LWIP了!用STM32CubeMX配置F407的TCP保活(KeepAlive)与自动重连

本文详细介绍了如何通过STM32CubeMX配置STM32F407的LWIP协议栈,实现TCP保活(KeepAlive)与自动重连功能,解决网络异常断开问题。文章提供了从基础环境配置到自动重连架构设计的完整指南,帮助开发者构建高可靠的网络连接机制,适用于工业物联网和嵌入式设备开发。

weixin_27038245的博客 234

为什么你的Spark作业跑得慢?Java调优的7个致命误区

解决Spark作业性能瓶颈,揭秘Java Spark开发中常见的7个调优误区。涵盖序列化、内存管理、RDD持久化等关键场景,提升执行效率。掌握这些核心技巧,让作业运行更快更稳,值得收藏。

CodeWhim的博客 1099

UVM仿真卡住了?别慌!手把手教你定位并解决PH_TIMEOUT超时错误

本文详细解析了UVM仿真中常见的PH_TIMEOUT超时错误,提供了从错误诊断到解决方案的完整指南。通过理解错误机制、分析调试技巧和常见问题场景,帮助验证工程师快速定位并解决这一棘手问题,同时分享了预防措施与最佳实践,提升仿真效率。

weixin_28683065的博客 367

spark性能优化:shuffle调优

调优概述 大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。因此,如果要让作业的性能更上一层楼,就有必要对shuffle过程进行调优。但是也必须提醒大家的是,影响一个Spark作业性能的因素,主要还是代码开发、资源参数以及数据倾斜,shuffle调优只能在整个Spark的性能调优中占到一小部分而已。因此大家务必把握住调优

龙珠课堂 1609

PINN内嵌物理知识神经网络入门及文献总结

内嵌物理知识深度学习方法(PINN)已经成功用于解决各类科学计算问题,其本质是将物理先验知识嵌入神经网络训练中,将一个求解PDE的问题转化为一个优化问题。这篇博客主要记录PINN相关论文

山里娃的博客 7万+

别再死记硬背参数了!手把手教你用Fluent欧拉模型搞定流化床模拟(附颗粒粘度/体积分数设置详解)

本文深入解析Fluent欧拉模型在流化床模拟中的应用,重点讲解颗粒粘度和体积分数等关键参数的设置原理与科学方法。通过对比不同模型(如Syamlal-O'Brien、Gidaspow)的适用场景,帮助工程师摆脱参数死记硬背,实现精准模拟。内容涵盖相间作用机制、求解策略优化及结果验证,为化工、能源领域的流化床模拟提供实用指南。

weixin_42656416的博客 429

Spark性能调优实战(通用性能调优)-极客时间-吴磊

8.应用开发三原则:如何拓展自己的开发边界? 通用的调优方法和技巧 主要包含:开发原则、配置项、Shuffle 以及硬件资源这四个方面 比如 Filter + Coalesce 和用 mapPartitions 代替 map,以及用 ReduceByKey 代替 GroupByKey 等等。我相信,你在日常的开发工作中肯定已经积累了不少。但是据我观察,很多同学在拿到这些技巧之后,都会不假思索地“照葫芦画瓢”。不少同学反馈:“试了之后怎么没效果啊?算了,反正能试的都试了,我也实在没有别的调优思路了,就这样吧”

紫蝶侠的博客 6218

个人整理的数据集(手写中文数据、发票数据、快递单数据、车牌数据)

本人在工作生活中收集了各个方面比较多的真实的数据集如下: 一、手写中文数据集 1、档案类数据: 此数据集为手写档案数据,数量较大,大约128G,图像均未标注。 ex: 2、手写作文数据: 此数据集为手写作文数据,是大约800M左右,图像按行提供位置和内容标注,十分珍贵。 ex: 二、发票数据集: 1、增值税发票 此数据集包含了大量真实的增值税发票数据,大约9G,标注了发票位置数据,未提供详细标注。 ex: 2、购车发票 此数据集未提供标注。

weixin_43143224的博客 5875

Spark性能调优的道与术:从理论到实践的精髓

性能优化是Spark开发中永恒的话题,优秀的调优策略往往需要在理论深度与实践经验之间找到平衡点。本文将系统性地介绍Spark性能调优的核心方法论,涵盖资源分配策略、Shuffle机制演进以及现代监控调优工具链,帮助开发者构建高性能的Spark应用。随着Spark on Kubernetes的普及和AI驱动的自动调优发展,性能优化正变得更加智能化。但深入理解这些核心原理,仍是应对复杂场景的基础。:对于批处理作业,初始Executors设为总任务的1/4,最大Executors设为集群可用资源的80%。

Daoyiyun的博客 905

ROS入门教程(七)—— Gazebo与RViz联合仿真

通过Gazebo与RViz联合仿真实现机器人运动。

吾门的博客 1万+

【异常】Codybuddy Error Code: 14003 too many requests 限流报错问题排查与解决指南

14003报错本质为服务端限流拦截,并非账号封禁或程序致命故障,90%以上的场景可通过等待冷却+规范使用行为解决。通过本文的排查步骤,可快速恢复工具使用,同时规避后续重复触发该问题。

奶爸的编程之路,也就一周冷个三天 1253

Spark SQL 中的 Tungsten 优化是什么?它对性能提升的关键点是什么?

Spark SQL核心引擎Tungsten通过系统级优化突破JVM性能瓶颈,主要包含四大组件:内存管理采用二进制格式减少60-80%内存占用;全阶段代码生成消除虚函数调用;缓存感知算法提升缓存命中率40-60%;向量化执行利用SIMD指令。基准测试显示端到端性能提升5-10倍,特别适合数值计算和复杂聚合场景,但对UDF支持有限。通过堆外内存管理和代码生成等技术,Tungsten显著降低了GC开销和CPU利用率,成为大数据处理性能优化的典范。

weixin_45422672的博客 1063

问答式AI vs 智能体(Agent):它们有什么不同?

你肯定用过 ChatGPT 或文心一言——问它一个问题,它给你一个答案。AI Agent(AI智能体)。很多人搞不清楚:它们不都是"AI"吗?有什么区别?这篇文章用一个最简单的类比,彻底讲清楚这两者的本质差异。框架特点适合人群AutoGPT完全自主执行任务,链式思考开发者MetaGPT模拟团队协作,多角色分工开发者LangChain最流行的Agent开发框架开发者Dify可视化无代码搭建Agent非技术用户Coze(扣子)字节跳动出品,国内最易用普通用户WorkBuddy。

Johnny2004的专栏 446

Apache Spark 第 6 章 附加篇:Tungsten 引擎深度解析

摘要: Apache Spark的Tungsten引擎通过堆外内存、缓存感知计算、向量化执行和WholeStage CodeGen四大机制,有效解决了JVM在大数据处理中的性能瓶颈。Tungsten采用UnsafeRow内存格式提升访问效率,利用缓存优化算法减少内存随机访问,通过向量化执行发挥CPU SIMD指令优势,并借助运行时代码生成消除虚函数调用开销。实际测试显示,Tungsten将Spark性能提升数倍至数十倍,尤其在高并发场景下效果显著。

zfqzpp的专栏 866

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spark——Spark Project Tungsten深入解析

文章目录 https://databricks.com/blog/2015/04/28/project-tungsten-bringing-spark-closer-to-bare-metal.html http://www.slideshare.net/SparkSummit/deep-dive-into-project-tungsten-josh-rosen https://medium.com/@goyalsaurabh66/project-tungsten-and-catalyst-sql-opti

aof 1181

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

视频教程-Spark内核机制解析及性能调优教程(含资料)-Spark

Spark内核机制解析及性能调优教程(含资料) 张长志技术全才、擅长领域:区...

weixin_34255269的博客 337

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: Spark性能调优(八)之Spark Tungsten-sort Based Shuffle
下一篇: Spark性能调优(十)之Spark统一内存管理
囧芝麻
博客等级 码龄10年 10粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值