深入理解 Spark 中的 Shuffle

 Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客

Spark 的Standalone集群环境安装与测试-CSDN博客

PySpark 本地开发环境搭建与实践-CSDN博客

Spark 程序开发与提交:本地与集群模式全解析-CSDN博客

Spark on YARN:Spark集群模式之Yarn模式的原理、搭建与实践-CSDN博客

Spark 中 RDD 的诞生:原理、操作与分区规则-CSDN博客

Spark 中的 RDD 分区的设定规则与高阶函数、Lambda 表达式详解-CSDN博客

RDD 算子全面解析:从基础到进阶与面试要点-CSDN博客

PySpark 数据处理实战:从基础操作到案例分析-CSDN博客

Spark 的容错机制:保障数据处理的稳定性与高效性-CSDN博客

Spark 共享变量:广播变量与累加器全解析-CSDN博客

Spark 核心概念与宽窄依赖的详细解析-CSDN博客

        在 Spark 的大数据处理世界里,Shuffle 是一个极为关键的概念。它在处理分布式大数据量的全局分组、全局排序以及重新分区等任务时起着核心作用。本文将深入探讨 Spark 中的 Shuffle,包括其设计理念、产生 Shuffle 的算子、不同类型的 Shuffle 及其特点、优化以及相关的钨丝计划等内容。

一、Spark 的 Shuffle 设计

        Spark Shuffle 过程又被称为宽依赖过程。与一些完全依赖内存计算的模式不同,Spark 在面临诸如全局分组、排序和重新分区等问题时,需要借助 Shuffle 过程在磁盘划分的基础上进行处理,以实现高效的数据处理与分布式计算。

二、产生 Shuffle 的算子

        在 Spark 中,有一些特定的算子会引发 Shuffle 操作。例如,涉及到数据重新分区的算子,像 repartition 等;还有基于键值对进行聚合操作的算子,如 reduceByKey 等,这些算子在执行过程中往往需要对数据进行全局的重新组织和处理,从而触发 Shuffle 过程。

只要这个算子包含以下三个功能之一:必须经过Shuffle
大数据量全局分组:reduceByKey、groupByKey
大数据量全局排序:sortBy、sortByKey
大数据量增大分区:repartition、coalesce 

还有一个:join

groupByKey sortByKey sortBy reduceByKey repartition
coalesce(根据情况)  join / fullOuterJoin / leftOuterJoin / rightOuterJoin

三、Spark 中的 Shuffle 分类

Spark 0.8及以前 Hash Based Shuffle
Spark 0.8.1 为Hash Based Shuffle引入File Consolidation机制
Spark 1.1 引入Sort Based Shuffle,但默认仍为Hash Based Shuffle
Spark 1.2 默认的Shuffle方式改为Sort Based Shuffle
Spark 1.4 引入Tungsten-Sort Based Shuffle直接使用堆外内存和新的内存管理模型,节省了内存空间和大量的gc,提升了性能
Spark 1.6 Tungsten-sort并入Sort Based Shuffle
Spark 2.0 Hash Based Shuffle退出历史舞台

(一)Hash Based Shuffle

  1. 特点:这种 Shuffle 方式主要侧重于分区操作,不会对数据进行排序。每个 Task 会依据 ReduceTask 的个数生成多个文件,其数量为 M * R(M 为 MapTask 数量,R 为 ReduceTask 数量)。
  2. 优点:在数据量较小的情况下,由于其设计相对简单,不需要复杂的排序逻辑,所以性能表现较为出色。
  3. 缺点:当数据量增大时,会产生大量的小文件,这不仅会占用大量的磁盘空间,还会导致磁盘 I/O 性能急剧下降,从而使得整体性能非常差。

(二)Hash Based Shuffle(优化后的 File Consolidation 机制)

        在引入 File Consolidation 机制后,例如有两个 Executor 和 4 个 ReduceTask 的场景下,以前如果是 4 个 map 和 4 个 reduce 会形成 16 个文件,而现在仅生成 8 个文件。这种优化机制通过整合 Executor 的资源,在一定程度上减少了小文件的数量,缓解了磁盘压力,提升了性能。

(三)Sort Based Shuffle(目前最新的)

1)Shuffle Write

        类似于 MapReduce 中的 Map 端 Shuffle,但 Spark 的 Shuffle Write 有 3 种方式,分别是 SortShuffleWriter、BypassMergeSortShuffleWriter 和 UnsafeShuffleWriter,Spark 2 以后会根据情况自动判断选择哪种 Shuffle Write。

1.SortShuffleWriter(普通Sort Shuffle Write机制

排序,生成一个整体基于分区和分区内部有序的文件和一个索引文件
大多数场景:数据量比较大场景  与MR的Map端Shuffle基本一致
特点:有排序,先生成多个有序小文件,再生成整体有序大文件,每个Task生成2个文件,数据文件和索引文件
Sort Shuffle Write过程与MapReduce的Map端shuffle基本一致

2.BypassMergeSortShuffleWriter

类似于优化后的Hash Based Shuffle,先为每个分区生成一个文件,最后合并为一个大文件,分区内部不排序
条件:分区数小于200,并且Map端没有聚合操作
场景:数据量小

跟第一个相比,处理的数据量小,处理的分区数小于200 ,不在内存中排序。

3.UnsafeShuffleWriter

钨丝计划方案,使用UnSafe API操作序列化数据,使用压缩指针存储元数据,溢写合并使用fastMerge提升效率

条件:Map端没有聚合操作、序列化方式需要支持重定位,Partition个数不能超过2^24-1个

4.在什么情况下使用什么ShuffleWriter 呢?

ShuffleWriter的实现方式有三种:

BypassMergeSortShuffleWriter

使用这种shuffle writer的条件是:

(1) 没有map端的聚合操作
(2) 分区数小于参数:spark.shuffle.sort.bypassMergeThreshold,默认是200

UnsafeShuffleWriter

使用这种shuffle writer的条件是:

(1) 序列化工具类支持对象的重定位
(2) 不需要在map端进行聚合操作
(3) 分区数不能大于:PackedRecordPointer.MAXIMUM_PARTITION_ID + 1

SortShuffleWriter

若以上两种shuffle writer都不能选择,则使用该shuffle writer类。
这也是相对比较常用的一种shuffle writer。

2)Shuffle Read

        类似于 MapReduce 中的 Reduce 端 Shuffle,但在 Spark 中其功能由算子来决定。例如,reduceByKey 的 Shuffle Read 只进行分组聚合,不排序;sortByKey 只排序,不分组;repartition 则既不排序也不分组。

四、钨丝计划(Tungsten)

        Tungsten 聚焦于 CPU 和 Memory 使用,旨在深度挖掘分布式硬件的潜能。由于 Spark 运行在 JVM 平台,而 JVM 的垃圾回收(GC)机制在一定程度上限制了 Spark 的性能。Tungsten 采用了 off - heap(堆外内存)技术,也就是使用 JVM 之外的内存空间,实现了自己独立的内存管理。这样就有效避免了 JVM 的 GC 引发的性能问题,同时还减少了序列化和反序列化的开销。例如,UnsafeShuffleWriter 会将数据序列化,放入缓冲区进行排序,排序结束后 Spill 到磁盘,最终合并 Spill 文件为一个大文件,并且在内存存储时使用了 Java 的 Unsafe API,这就是钨丝计划在 Shuffle 过程中的具体体现。

五、总结

        Spark 中的 Shuffle 是其分布式计算体系中的关键环节。不同类型的 Shuffle 有着各自的特点和适用场景,从早期的 Hash Based Shuffle 到如今的 Sort Based Shuffle,以及不断演进的优化机制和钨丝计划的融入,都体现了 Spark 在追求高性能分布式数据处理道路上的持续探索和创新。深入理解 Spark 的 Shuffle 机制对于优化大数据处理任务、提升系统性能具有极为重要的意义,无论是对于 Spark 开发者还是大数据从业者,都值得深入研究和掌握。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常用在汽车PKE无钥匙进入系统的高度集成SOC芯片:CSM2433

CSM2433是一款集成2.4GHz频段发射器、125KHz接收器和8位RISC(精简指令集)MCU的SOC芯片,用在汽车PKE无钥匙进入系统里。 什么是汽车PKE无钥匙进入系统? 无钥匙进入系统具有无钥匙进入并且启动的功能,英文名称是PKE&…

人力资源招聘系统-提升招聘效率与质量的关键工具

在当今这个竞争激烈的商业环境中,企业要想在市场中立于不败之地,关键在于拥有高素质的人才队伍。然而,传统的招聘方式往往效率低下,难以精准匹配企业需求与人才特质,这无疑给企业的发展带来了不小的挑战。 随着科技的飞…

R语言贝叶斯分析:INLA 、MCMC混合模型、生存分析肿瘤临床试验、间歇泉喷发时间数据应用|附数据代码...

全文链接:https://tecdat.cn/?p38273 多模态数据在统计学中并不罕见,常出现在观测数据来自两个或多个潜在群体或总体的情况。混合模型常用于分析这类数据,它利用不同的组件来对数据中的不同群体或总体进行建模。本质上,混合模型是…

算法--解决二叉树遍历问题

第一 实现树的结构 class Node(): # 构造函数,初始化节点对象,包含数据和左右子节点 def __init__(self, dataNone): self.data data # 节点存储的数据 self.left None # 左子节点,默认为None self.rig…

华为eNSP:MSTP

一、什么是MSTP? 1、MSTP是IEEE 802.1S中定义的生成树协议,MSTP兼容STP和RSTP,既可以快速收敛,也提供了数据转发的多个冗余路径,在数据转发过程中实现VLAN数据的负载均衡。 2、MSTP可以将一个或多个VLAN映射到一个Inst…

从零到一:利用 AI 开发 iOS App 《震感》的编程之旅

在网上看到一篇关于使用AI开发的编程经历,分享给大家 作者是如何在没有 iOS 开发经验的情况下,借助 AI(如 Claude 3 模型)成功开发并发布《震感》iOS 应用。 正文开始 2022 年 11 月,ChatGPT 诞生并迅速引发全球关注。…

C++__day1

1、思维导图 2、如果登录失败&#xff0c;提示用户登录失败信息&#xff0c;并且提示错误几次&#xff0c;且重新输入&#xff1b;如果输入错误三次&#xff0c;则退出系统 #include <iostream> using namespace std;int main() {string id , pswd;string user"admi…

MySQL45讲 第二十讲 幻读是什么,幻读有什么问题?

文章目录 MySQL45讲 第二十讲 幻读是什么&#xff0c;幻读有什么问题&#xff1f;一、幻读的定义二、幻读带来的问题&#xff08;一&#xff09;语义问题&#xff08;二&#xff09;数据一致性问题 三、InnoDB 解决幻读的方法四、总结 MySQL45讲 第二十讲 幻读是什么&#xff0…

web与网络编程

使用HTTP协议访问Web 通过发送请求获取服务器资源的Web浏览器等&#xff0c;被成为客户端(client)。 Web使用一种名为HTTP(超文本传输协议)的协议作为规范&#xff0c;完成从客户端到服务器端等一系列运作流程。 可以说&#xff0c;Web时建立在HTTP协议上通信的。 网络基础T…

深入理解接口测试:实用指南与最佳实践5.0(五)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

2024游戏陪玩app源码的功能介绍/线上陪玩交友上线即可运营软件平台源码搭建流程

一个完整的陪玩交友系统从概念到实现再到维护的全过程得以清晰展现。每一步都需要团队的紧密协作与细致规划&#xff0c;以确保系统既满足用户需求&#xff0c;又具备良好的稳定性和可扩展性。 基础框架 移动端开发框架&#xff1a;如uniapp&#xff0c;它支持多平台开发&…

预测AI如何提升销售绩效管理:五大方式

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

修改数据库和表的字符集

1、修改数据库字符集 mysql> show CHARACTER SET; 查看所有字符集 mysql> show create database wordpress; 查看数据库wordpress当前字符集mysql> alter database wordpress character set gbk; 将数据库wordpress字符集改为gb…

DB-GPT系列(四):DB-GPT六大基础应用场景part1

一、基础问答 进入DB-GPT后&#xff0c;再在线对话默认的基础功能就是对话功能。这里我们可以和使用通义千问、文心一言等在线大模型类似的方法&#xff0c; 来和DB-GPT进行对话。 但是值得注意的是&#xff0c;DB-GPT的输出结果是在内置提示词基础之上进行的回答&#xff0c…

海量数据面试题

目录 前言 什么是海量数据 一、利用位图解决 二、利用布隆过滤器解决 三、利用哈希切割解决 前言 在大数据时代&#xff0c;海量数据处理已成为技术领域中的一项重要课题。无论是企业级应用、互联网平台&#xff0c;还是人工智能和机器学习的实现&#xff0c;都离不开对大规…

操作系统实验:在linux下用c语言模拟进程调度算法程序

文章目录 1、实验内容2、实验结果及分析3、如何在linux下编写并执行c语言程序以及实验源代码gcc -o test test.c1、实验内容 1)用C语言编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟。…

前端开发迈向全栈之路:规划与技能

一、前端开发与全栈开发的差异 前端开发主要负责构建和实现网页、Web 应用程序和移动应用的用户界面。其工作重点在于网页设计和布局&#xff0c;使用 HTML 和 CSS 技术定义页面的结构、样式和布局&#xff0c;同时运用前端框架和库如 React、Angular 或 Vue.js 等构建交互式和…

GOLANG+VUE后台管理系统

1.截图 2.后端工程截图 3.前端工程截图

中文书籍对《人月神话》的引用(161-210本):微软的秘密

中文书籍对《人月神话》的引用&#xff08;第001到160本&#xff09;>> 《人月神话》于1975年出版&#xff0c;1995年出二十周年版。自出版以来&#xff0c;该书被大量的书籍和文章引用&#xff0c;直到现在热潮不退。 2023年&#xff0c;清华大学出版社推出《人月神话》…

IO流(五):字节流-输入流(Inpustream)、输出流(OutputStream)--使用场景、弊端、注意事项、代码演示。

目录 1、什么是字节流&#xff1f; 2、字节输入流--FileInputStream 2.1 int read()方式代码演示以及注释 2.1.1 读取一个字节 2.1.2 将整个文件挨个字节读取并打印演示 2.2 int read(byte[] buffer)方式代码演示以及注释 2.2 .1 一次读取3字节演示 2.2.2 一次性读取全…