spark2原理分析-RDD的shuffle简介

2023-10-18 02:10

本文主要是介绍spark2原理分析-RDD的shuffle简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

本文介绍RDD的Shuffle原理,并分析shuffle过程的实现。

RDD Shuffle简介

spark的某些操作会触发被称为shuffle的事件。shuffle是Spark重新分配数据的机制,它可以对数据进行分组,该操作可以跨不同分区。该操作通常会在不同的执行器(executor)和主机之间复制数据,这使shuffle成为复杂且非常消耗资源的操作。

Shuffle背景

为了理解shuffle过程,我们可以拿reduceByKey操作进行举例。reduceByKey操作会产生一个新的RDD,其中单个键的所有值都组合成一个元组(tuple) - 对key和与该key关联的所有值执行reduce函数的结果。挑战在于,并非单个key的所有值都必须位于同一个分区,甚至是同一个机器上,但它们必须能够被定位到才能计算结果。

在Spark中,数据通常不跨分区分布,以便特定操作能够访问到必要位置。

在计算过程中,单个任务将在单个分区上运行 - 因此,要组织单个reduceByKey reduce任务执行的所有数据,Spark需要执行all-to-all的操作。Spark必须从所有分区读取以查找所有key的所有值,然后将各个值组合在一起以计算每个key的最终结果 - 这个过程称为shuffle。

虽然新shuffle数据的每个分区中的元素集是确定的,且分区本身的顺序也是确定的,但分区中的数据的顺序是不确定的。如果在shuffle后希望得到特定顺序的数据,则可以使用:

  • 在mapPartitions使用例如.sorted对每个分区进行排序
  • repartitionAndSortWithinPartitions在同时重新分区的同时有效地对分区进行排序
  • sortBy来创建一个全局排序的RDD

可能导致shuffle的操作包括以下几种:

  • 重新分区(repartition)操作,例如: repartition和 coalesce。
  • ByKey操作(计数除外),例如:如groupByKey和reduceByKey
  • 联合(join)操作,例如:cogroup和join。

shuffle对性能的影响

shuffle操作十分昂贵(消耗性能和资源),因为它包括:磁盘I/O,数据序列号,网络I/O等操作。为了对数进行shuffle,Spark创建了一个任务集,map任务负责组织数据,reduce任务负责对数据进行聚合。这两个术语来自MapReduce,但与Spark的map和reduce操作并没有直接关系。

在内部,各个map任务的结果会保留在内存中,直到它们不再合适(fit)。然后,这些结果基于目标分区进行排序并写入单个文件。reduce任务读取相关的排好序的数据块。

某些shuffle操作会消耗大量的堆内存,因为它们使用内存中的数据结构来在传输记录之前或之后组织记录。具体来说,reduceByKey和aggregateByKey在map端创建这些结构,并且’ByKey操作在reduce端生成这些结构。当数据不适合内存时,Spark会将这些写入到磁盘,从而导致磁盘I / O的额外开销和垃圾收集的增加。

Shuffle还会在磁盘上生成大量中间文件。从Spark 1.3开始,这些文件将被保留,直到对应的RDD不再被使用,且被垃圾回收。这样做是为了在重新计算谱系时不需要重新创建shuffle文件。如果应用程序保留对这些RDD的引用或GC不经常启动,则垃圾收集可能仅在很长一段时间后才会发生。这意味着长时间运行的Spark作业可能会占用大量磁盘空间。配置Spark上下文时,spark.local.dir配置参数指定临时存储目录。

可以通过调整各种配置参数来调整shuffle行为。具体的配置将会在实战部分讲到。

注:以上两端来自官方文档对shuffle过程的说明。

理解shuffle过程

从以上分析我们可以看出,分区之间的物理数据的搬迁被称为shuffling。当需要构建新的RDD时,为了构建新的分区需要整合多个分区的数据,就会发生shuffling。例如:当通过key对成员进行分组时,Spark可能会扫描所有分区,来发现具有相同key的元素,然后在物理上对这些数据进行分组。

从以下图中可以看出具体shuffling过程:
在这里插入图片描述
上图是《spark in action》中的例子图。

上图是一个通过key来聚合数据的例子,开始的时候各个key的数据分布在不同的Spark节点上。先进行transform过程,转换过程是在各个数据的分区上进行,聚合过程需要从不同节点的分区上获取数据,此时将会发生shuffling。

注意:关于shuffle的详细代码实现,还会有文章专门进行讲解。

参考资料

  • spark官方文档

这篇关于spark2原理分析-RDD的shuffle简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/229511

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源