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

深入理解 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 开发者还是大数据从业者,都值得深入研究和掌握。

相关文章:

深入理解 Spark 中的 Shuffle

Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…...

leetcode-8-字符串转整数

题解: 代码:...

SQL注入注入方式(大纲)

SQL注入注入方式(大纲) 常规注入 通常没有任何过滤,直接把参数存放到SQL语句中。 宽字节注入 GBK 编码 两个字节表示一个字符ASCII 编码 一个字节表示一个字符MYSQL默认字节集是GBK等宽字节字符集 原理: 设置MySQL时错误配置…...

OpenCV基础(1)

1.图像读写与窗口显示 1.1.imread读取图像文件 Mat cv::imread(const string &filename,int flags IMREAD_COLOR); filename:要读取的图像文件名flags:读取模式,可以从枚举cv::ImreadModes中取值,默认取值是IMREAD_COLOR&am…...

【freertos】FreeRTOS信号量的介绍及使用

FreeRTOS信号量 一、概述二、PV原语三、函数接口1.创建一个计数信号量2.删除一个信号量3.信号量释放4.在中断释放信号量5.获取一个信号量,可以是二值信号量、计数信号量、互斥量。6.在中断获取一个信号量,可以是二值信号量、计数信号量7.创建一个二值信号…...

React Native 全栈开发实战班 - 图片加载与优化

在移动应用中,图片加载与优化 是提升用户体验和减少资源消耗的重要环节。图片加载不当可能导致应用卡顿、内存泄漏甚至崩溃。本章节将介绍 React Native 中常用的图片加载方法,包括 Image 组件的使用、第三方图片加载库(如 react-native-fast…...

Golang云原生项目:—实现ping操作

熟悉报文结构 ICMP校验和算法: 报文内容,相邻两个字节拼接到一起组成一个16bit数,将这些数累加求和若长度为奇数,则将剩余一个字节,也累加求和得出总和之后,将和值的高16位与低16位不断求和,直…...

mysql如何查看当前事务的事务id

-- 开启一个事务,但不执行写操作 START TRANSACTION; -- 查询 InnoDB 事务信息 SELECT * FROM information_schema.innodb_trx;在 MySQL 的 MVCC (多版本并发控制) 中,事务 ID (Transaction ID) 是由 InnoDB 存储引擎分配的,它的分配机制与事…...

在linux里如何利用vim对比两个文档不同的行数

在Linux中,可以使用vimdiff命令来对比两个文档中不同的行。首先确保你的系统中安装了vim编辑器。 打开终端,使用以下命令来启动vimdiff: vimdiff file1 file2 这里file1和file2是你想要对比的两个文件的路径。 vimdiff会以并排方式打开两…...

深入解析Python中的逻辑回归:从入门到精通

引言 在数据科学领域,逻辑回归(Logistic Regression)是一个非常重要的算法,它不仅用于二分类问题,还可以通过一些技巧扩展到多分类问题。逻辑回归因其简单、高效且易于解释的特点,在金融、医疗、广告等多个…...

【数据库】mysql数据库迁移前应如何备份数据?

MySQL 数据库的备份是确保数据安全的重要措施之一。在进行数据库迁移之前,备份现有数据可以防止数据丢失或损坏。以下是一套详细的 MySQL 数据库备份步骤,适用于大多数情况。请注意,具体的命令和工具可能因 MySQL 版本的不同而有所差异。整个…...

C语言——鸡兔同笼问题

没注释的源代码 #include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { int tou 10; i…...

数据结构王道P234第二题

#include<iostream> using namespace std; int visit[MAxsize]; int color[MaxSize];//1表示红&#xff0c;2表示白&#xff1b; bool dfs(Graph G, int i){visit[i]1;ArcNode *p;bool flag1;for(pG.vertices[i].firsrarc; p ; pp->next){int jp->adjvex;if(!visi…...

层归一化和批归一化

层归一化是针对某一样本的所有特征&#xff0c;批归一化是针对所有样本的某一特征。 计算公式&#xff1a;&#xff08;当前值 - 均值&#xff09;/ 标准差。 作用&#xff1a;缓解梯度消失和梯度爆炸的问题&#xff0c;并提高网络的泛化性能。 为什么Transform和BERT中使用层归…...

Spring Cloud Gateway 网关

微服务网关 Spring Cloud Gateway https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories Spring Cloud 在版本 2020.0.0 开始&#xff0c;去除了 Zuul 网关的使用&#xff0c;改用 Spring Cloud Gateway 作为网关…...

LabVIEW中的UDP与TCP比较

在LabVIEW中&#xff0c;UDP和TCP可以用于不同的网络通信场景&#xff0c;开发者可以根据需求选择合适的协议。以下是结合LabVIEW开发时的一些比较和应用场景&#xff1a; 1.TCP在LabVIEW中的应用&#xff1a; 可靠性高的场景&#xff1a;当开发一个对数据传输的准确性和完整…...

半导体器件与物理篇3 P-N结

热平衡时的PN结 pn结的定义&#xff1a;由p型半导体和n型半导体接触形成的结 pn结的特性和关键变量包括&#xff1a;整流性&#xff08;即电流单向导通的特性&#xff09;、平衡费米能级&#xff08;费米能级 E F E_F EF​为常数, d E F d x 0 &#xff09;、内建电势 \frac…...

深入剖析String类的底层实现原理

嘿嘿,家人们,今天咱们来模拟实现string,好啦,废话不多讲,开干! 1:string.h 1.1:构造函数与拷贝构造函数 1.1.1:写法一 1.1.2:写法二(给缺省值) 1.2:赋值运算符重载与operatror[]获取元素 1.3:容量与迭代器 1.4:reserve与resize 1.5:清空与判断是否为空 1.6:push_back与…...

#其它:面试题

第一面试官提问如下&#xff1a; 1、自我介绍 2、根据项目提问&#xff1a;混合开发调取api的通讯方式 3、技术提问&#xff1a;如何隐藏div&#xff0c;但是div需要存在 使用 visibility 隐藏&#xff1a; 1.visibility: hidden2.display: none 3.opcity: 04、css塌陷问题…...

计算机视觉中的双边滤波:经典案例与Python代码解析

&#x1f31f; 计算机视觉中的双边滤波&#xff1a;经典案例与Python代码解析 &#x1f680; Hey小伙伴们&#xff01;今天我们要聊的是计算机视觉中的一个重要技术——双边滤波。双边滤波是一种非线性滤波方法&#xff0c;主要用于图像去噪和平滑&#xff0c;同时保留图像的边…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...