Spark性能调优(八)之Spark Tungsten-sort Based Shuffle

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

一:使用Tungsten功能
1, 如果想让您的程序使用Tungsten的功能,可以配置:
Spark.Shuffle.Manager = tungsten-sort

这里写图片描述

Tungsten中文blog

Tungsten英文blog

Spark在钨丝计划下要管理两种类型的内存存储方式:堆内和堆外。为了管理他们,所以搞了一个Page。
堆外:指针直接指向数据本身。
堆内:指针首先指向Object,然后通过偏移量OffSet再具体定位到数据。
2. DataFrame中自动开启了Tungsten功能。

二:Tungsten-sort base Shuffle writer内幕
下图是写入的过程:
Spark Core
这里写图片描述

输入数据的时候是循环每个Task中处理的数据Partition的结果,循环的时候会查看是否有内存,一个Page写满之后,才会写下一个Page。
如何看内存是否足够?
a) 系统默认情况下给ShuffleMapTask最大准备了多少内存空间?默认情况下是通过ExecutorHeapMemory*0.8*0.2
Spark.shuffle.memoryFraction=0.2
spark.shuffle.safetyFraction=0.8
b) 另外一方面是和Task处理的Partition大小紧密相关。
1.mergeSpills的功能是将很多小文件合并成一个大文件。然后加上index文件索引。

/**
 * Merge zero or more spill files together, choosing the fastest merging strategy based on the
 * number of spills and the IO compression codec.
 *
 * @return the partition lengths in the merged file.
 */
private long[] mergeSpills(SpillInfo[] spills, File outputFile) throws IOException {
  final boolean compressionEnabled = sparkConf.getBoolean("spark.shuffle.compress", true);
  final CompressionCodec = CompressionCodec$.MODULE$.createCodec(sparkConf);
  final boolean fastMergeEnabled =
    sparkConf.getBoolean("spark.shuffle.unsafe.fastMergeEnabled", true);
  final boolean fastMergeIsSupported = !compressionEnabled ||
    CompressionCodec$.MODULE$.supportsConcatenationOfSerializedStreams(compressionCodec);

2.和Sort Based Shuffle 过程基本一样。
3.写数据在内存足够大的情况下是写到Page里面,在Page中有一条条的Record,如果内存不够的话会Spill到磁盘中。此过程跟前面讲解Sort base Shuffle writer过程是一样的。
4.基于UnsafeShuffleWriter会有一个类负责将数据写入到Page中。
5.insertRecordIntoSorter: 此方法把records的数据一条一条的写入到输出流。
而输出流是: ByteArrayOutputStream

@VisibleForTesting
void insertRecordIntoSorter(Product2<K, V> record) throws IOException {
  assert(sorter != null);
  final K key = record._1();
//获得Partition的Id  
final int partitionId = partitioner.getPartition(key);
  serBuffer.reset();
  serOutputStream.writeKey(key, OBJECT_CLASS_TAG);
  serOutputStream.writeValue(record._2(), OBJECT_CLASS_TAG);
  serOutputStream.flush();

  final int serializedRecordSize = serBuffer.size();
  assert (serializedRecordSize > 0);

  sorter.insertRecord(
    serBuffer.getBuf(), Platform.BYTE_ARRAY_OFFSET, serializedRecordSize, partitionId);

6.serBuffer实例化,默认大小是1M,也就是输出流的大小默认是1M。

serBuffer = new MyByteArrayOutputStream(1024 * 1024);

三:Tungsten-sort base Shuffle Read内幕
1. 基本上是复用了Hash Shuffle Read.
2. 在Tungsten下获取数据的类叫做BlockStoreShuffleReader,其底层其实是Page。

Spark Tungsten-sort Based Shuffle 分析 本篇博客主要是对Tungsten-sort Based Shuffle简单分析,因为钨丝计划还没有成熟,所以这里不会太详细的介绍。 一:使用Tungsten功能 1, 如果想让您的程序使用Tungsten的功能,可以配置: Spark.Shuffle.Manager = tungsten-sort Spark在钨丝计划下要管理两种类型的内存存储方式:堆内和堆外。为了管理他们,所以搞了一 阅读详情

相关推荐

Spark核心知识点和面试高频考点

Apache Spark 是一个开源的统一分布式计算引擎,它以内存计算为核心,提供了 Java、Scala、Python、R 等高级 API,并提供以下功能:Spark Core(核心基础):负责分布式任务调度、内存管理、容错、存储交互等基础功能。它引入了 RDD(弹性分布式数据集) 这一核心抽象,是所有其他组件的基石。Spark SQL(结构化数据处理):用于处理结构化与半结构化数据,提供了DataFrame、Dataset,以及SQL查询引擎。底层也是基于RDD进行了封装优化。Spark Streami

qq_37771475的博客 779

Spark性能优化第八季之Spark Tungsten-sort Based Shuffle

一:使用Tungsten功能 1, 如果想让您的程序使用Tungsten的功能,可以配置: Spark.Shuffle.Manager = tungsten-sort Tungsten中文blogTungsten英文blogSpark在钨丝计划下要管理两种类型的内存存储方式:堆内和堆外。为了管理他们,所以搞了一个Page。 堆外:指针直接指向数据本身。 堆内:指针首先指向Obje

sundujing的博客 1159

Spark Tungsten:数据结构与代码生成的双重革新

Tungsten是Apache Spark的性能优化项目,通过引入Unsafe Row数据结构和基于内存页的管理,以及全阶段代码生成(WSCG),减少存储开销、提升GC效率,并优化CPU缓存命中率,从而显著提高Spark的性能。

数据与算法架构提升之路专栏 552

【Spark精讲】一文搞懂Spark钨丝Tungsten

【Spark精讲】一文搞懂Spark钨丝Tungsten、内存管理机制、缓存敏感计算( Cache-aware computation)、动态代码生成( Code generation)

话数Science 1792

Spark商业案例与性能调优实战100课》第26课:电光石火间从根本上理解Spark中Sort-Based Shuffle产生的内幕及其tungsten-sort 背景解密

Spark商业案例与性能调优实战100课》第26课:电光石火间从根本上理解Spark中Sort-Based Shuffle产生的内幕及其tungsten-sort 背景解密

大模型与Agent智能体 908

使用 ChatGPT/Copilot 提升前端开发效率的 N 种方式

typescript// 输入:根据这个 JavaScript 对象,生成完整的 TypeScript 类型定义id: '123',stock: 50,},// ChatGPT 生成:id: string;discount?: number;// 可选属性// 只读属性// 更进一步,生成 Zod schema 用于运行时验证:});}),});AI 代码助手真正的革命性不在于它能生成多少代码,而在于它改变了我们解决问题的方式。

fineday 1590

Spark Tungsten

Tungsten 地址 : 统一 128 位内存地址 , 为了统一管理 Off Heap 和 On Heap 内存空间。迭代器嵌套 :同个 Stage 内部,把多个 RDD 的 compute 函数合成一个函数,再一次性输出数据。WSCG 工作过程 : 基于性能较差的代码,在运行时动态地 (On The Fly) 重构出性能更好的代码。WSCG :基于同一 Stage 内操作符的调用关系,把所有计算进行手写,并合成一个函数。Tungsten 引入 WSCG 机制,消除了 VI 模型引入的计算开销。

记录点点滴滴 767

k8s 100个高频面试题

以下是 100 个 Kubernetes(k8s)高频面试题及其答案,涵盖了 Kubernetes 的核心概念、架构、组件、工作原理以及实际应用。答案:Master 节点组件:API Server:提供 RESTful API 接口,用于与集群交互。etcd:分布式键值存储,用于存储集群的配置数据和状态信息。Controller Manager:运行各种控制器进程,负责维护集群的状态。Scheduler:负责将 Pod 调度到合适的节点上运行。Worker 节点组件:Kubelet:运行在每个节点上的代理,

wankll的专栏 2775

你弄懂了Spark的Shuffle实现方式吗?手把手带你解析Spark的Sort Shuffle和Tungsten-Sort Shuffle

在大数据计算框架中,Shuffle阶段的设计优劣是决定性能好坏的关键因素之一。 为了深入理解Shuffle阶段的各个细节, 并进一步在理解的基础上优化代码,减少不必要的Shuffle开销, 我将通过几篇博客深入分析Spark Shuffle阶段的源代码实现,详细解析Spark Shuffle阶段的实现细节,主要内容包括Shuffle机制框架详解和当前Spark 2.12 中已经支持的Shuffle阶段的2种设计与实现。本文主要介绍当前Spark 2.12 中已经支持的Shuffle阶段的2种设计与实现。 .

LMR的博客 4503

突破Shopee平台数据采集的风控挑战与技术解决方案

高效、稳定、合规的数据采集能力,始终是我们服务的核心价值。多类型代理组合:采用高匿名住宅代理(模拟真实用户IP)与数据中心代理(高并发需求)混合策略,结合IP轮换频率与目标国家后缀(如.com.my、.vn)动态匹配14。反反爬数据过滤:针对Shopee页面中的混淆数据(如虚假价格标签、隐藏元素),采用XPath精准定位结合正则表达式清洗,确保数据准确性89。随机化请求间隔:在爬虫代码中引入随机延迟(如1-5秒),并模拟“浏览-点击-滚动”等用户行为链,降低行为模式的可预测性48。

klj3388的博客 2976

STM32H743必要外围电路分析

写在前面:这篇博客是我第一次绘制STM32最小系统板的过程记录。 2020-1-11 BOOT STM32采用ARM内核,和ARM处理器一样,都有专门的boot脚决定单片机从何处启动。 在官方数据手册的第105页,我们可以看到 系统复位后,在SYSTICK的第四个上升沿锁存BOOT引脚的值,复位后,BOOT引脚可以由用户自由配置而不会影响系统正常运行。 BOOT引脚决定了自举存储器地址,当BO...

Cui_Hongwei的博客 1万+

Spark五:Spark的两种核心Shuffle

Spark 也有 Map 阶段和 Reduce 阶段,因此也会出现 Shuffle,介绍Spark的两种核心Shuffle,Hash Shuffle和Sort Shuffle

eight_Jessen的博客 2374

基于Python实现身份证信息识别

身份证是一种重要的证件,包含了个人的基本信息,如姓名、性别、出生日期、住址等。在实际应用中,有时需要对身份证进行自动化的识别,以提高工作效率和准确性。本文将介绍如何使用Python实现身份证信息的识别,通过图像预处理、OCR技术和解析算法,实现对身份证号码和其他信息的提取和解析。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

(二十八)Shuffle调优之HashShuffleManager与SortShuffleManager

前言 spark.shuffle.manager:hash、sort、tungsten-sort(自己实现内存管理) 之前我们所讲的,其实都是已经属于Spark中,比较老旧的一种shuffle manager,HashShuffleManager;这种manager,实际上,从spark 1.2.x版本以后,就不再是默认的选择了。 HashShuffleManager的原理,以及对应的一些性能调优的点,基本上,之前几讲,咱们就都讲过了。 spark 1.2.x版本以后,默认的shuffle manager,

weixin_37850264的博客 298

手把手教你学simulink(57.3)--电励磁同步电动机场景示例:基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机

目录基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机项目实例1. 项目背景2. 系统架构2.1 电励磁同步电动机模型2.2 三相逆变器模型2.3 自适应控制器(Adaptive Controller)2.4 系统框图3. 模型设计3.1 创建Simulink模型3.2 自适应控制(Adaptive Control)设计3.3 仿真环境搭建4. 参数优化4.1 自动调优5. 实际应用案例5.1 工业驱动系统5.2 风力发电系统6. 结论需求分析电励磁同步电动机(Electr

MHD0815的博客 503

标准论文参考文献添加方法——Zotero入门使用教程

第一篇论文投出去了,写一下最后一步的参考文献修饰润色吧! 论文的参考文献,即References,是论文的最后一步,相信不管是写毕设论文还是期刊论文都遇到过需要修改参考文献的情况,非常之麻烦。而且参考文献中经常会与生僻奇怪气体出现,一个一个修改非常浪费时间,这里介绍一下一个非常好用的软件Zetero。 第一步:软件的下载安装及绑定Word 尽量使用客户端吧,

MISAYAONE的博客 20万+

04 spark的shuffle详解

在 MapReduce 框架中, Shuffle 阶段是连接 Map 与 Reduce 之间的桥梁, Map 阶段通过 Shuffle 过程将数据输出到 Reduce 阶段中。由于 Shuffle 涉及磁盘的读写和网络 I/O,因此 Shuffle 性能的高低直接影响整个程序的性能。Spark 也有 Map 阶段和 Reduce 阶段,因此也会出现 Shuffle。

念陌曦的博客 464

8、使用 TPCx - HCI 基准测试表征 HCI 集群的性能和弹性

本文详细介绍了 TPCx - HCI 基准测试,用于衡量超融合基础设施(HCI)集群的性能、稳定性和扩展性。TPCx - HCI 扩展了 TPCx - V 的理念,通过 Tile 架构和弹性特性,全面评估硬件、虚拟化、存储和网络组件的表现。文章还通过多个实验场景分析了负载均衡、数据布局和重新同步策略对性能的影响,并提出了部署和优化 HCI 集群的建议。

sun99的博客 179

Spark的两种核心Shuffle详解

在 MapReduce 框架中, Shuffle 阶段是连接 Map 与 Reduce 之间的桥梁, Map 阶段通过 Shuffle 过程将数据输出到 Reduce 阶段中。由于 Shu...

过往记忆大数据 2077

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spark Tungsten-sort Based Shuffle 分析

Tungsten-sort 算不得一个全新的shuffle 方案,它在特定场景下基于类似现有的Sort Based Shuffle处理流程,对内存/CPU/Cache使用做了非常大的优化。带来高效的同时,也就限定了自己的使用场景。如果Tungsten-sort 发现自己无法处理,则会自动使用 Sort Based Shuffle进行处理。

allwefantasy的专栏 3477

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

从Shuffle机制看Spark性能优化:一场数据重组的艺术与科学

本文深度解析Spark Shuffle机制,探讨其在性能优化中的关键作用。从Hash Shuffle到Sort Shuffle的演进历程出发,详细介绍了参数调优、数据倾斜解决方案等实战策略,帮助开发者掌握大数据处理中的Shuffle优化技巧,提升Spark作业执行效率。

weixin_29219189的博客 353

Spark 2.x 中 Sort-Based Shuffle 产生的内幕

本课主题 Sorted-Based Shuffle的诞生和介绍 Shuffle 中六大令人费解的问题 Sorted-Based Shuffle 的排序和源码鉴赏 Shuffle 在运行时的内存管理 引言 在历史的发展中,为什么 Spark 最终还是选择放弃了 HashShuffle 而使用了 Sorted-Based Shuffle,而且作为后起之秀的 Tungsten-based Shuffle 它到底在什么样的背景下产生的。Tungsten-Sort Shuffle已经并入了 Sor...

玩转曼哈顿的博客 487

Shuffle调优之HashShuffleManager与SortShuffleManager

SortShuffleManager与HashShuffleManager两点不同: 1、SortShuffleManager会对每个reduce task要处理的数据,进行排序(默认的)。 2、SortShuffleManager会避免像HashShuffleManager那样,默认就去创建多份磁盘文件。一个task,只会写入一个磁盘文件,不同reduce task的数据,用offset来划分界...

Piratesa的博客 231

Spark Shuffle 源码

Spark Shuffle 源码 在划分stage时,最后一个stage称为finalStage, 它本质上是一个ResultStage对象,前面的所有stage被称为ShuffleMapStage。 ShuffleMapStage的结束伴随着shuffle文件的写磁盘。 ResultStage基本上对应代码中的action算子,即将一个函数应用在RDD的各个partition的数据集上,意味着一个job的运行结束 //org.apache.spark.scheduler.DAGScheduler#sub

地球人是我哈的博客 658
上一篇: Spark性能调优(七)之钨丝计划
下一篇: Spark性能调优(九)之Spark Tungsten内存使用
囧芝麻
博客等级 码龄10年 10粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值