【大数据学习 | Spark-Core】详解Spark的Shuffle阶段

1. shuffle前言

对spark任务划分阶段,遇到宽依赖会断开,所以在stage 与 stage 之间会产生shuffle,大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。

负责shuffle过程的执行、计算和处理的组件主要就是ShuffleManager,也即shuffle管理器。而随着Spark的版本的发展,ShuffleManager也在不断迭代。

ShuffleManager 大概有两个: HashShuffleManager 和 SortShuffleManager。

历史:

在spark 1.2以前,默认的shuffle计算引擎是HashShuffleManager;

在spark 1.2以后的版本中,默认的ShuffleManager改成了SortShuffleManager;

在spark 2.0以后,抛弃了 HashShuffleManager。

2. HashShuffleManager

上游 stage 有 2个 Executor,每个Executor 有 2 个 task。

下游 stage 有 3个task。

shuffle write阶段:

将相当于mapreduce的shuffle write, 上游的mapTask任务的数据按照key的hash 分桶,写出中间文件(个数为下游reduceTask的任务,即下游RDD分区的个数)。

写出中间文件个数 = maptask的个数 * reducetask的个数。

shuffle read 阶段:

就相当于mapreduce 的 shuffle read, 每个reducetask 拉取自己的数据。

由于shuffle write的过程中,task给下游stage的每个task都创建了一个磁盘文件,因此shuffle read的过程中,每个reducetask只要从上游stage的所有maptask所在节点上,拉取属于自己的那一个磁盘文件即可。

弊端:

shuffle write阶段占用大量的内存空间,会导致频繁的GC,容易导致OOM(out of memory);也会产生大量的小文件,写入过程中会产生大量的磁盘IO,性能受到影响。适合小数据集的处理。

3. HashShuffleManager 优化

开启consolidate机制。

设置参数:spark.shuffle.consolidateFiles。该参数默认值为false,将其设置为true即可开启优化机制。

shuffle write阶段

我们知道,如果executor的个数为5个,一个executor上的核心是1个,有10个分区的数据要处理,即一个核心要处理2个任务。

开启consolidate机制后,上游的每个mapTask任务的数据仍然按照key的hashCode值分桶,但每个任务并不会形成很多个中间小文件,而是对于每个executor的每个核来说,只会产生下游reduceTask个数的文件。优化后,HashShuffleManager允许上游的交给由一个executor的一个core处理的多个maptask任务的数据以追加形式写入文件组,这样就可以有效将多个task的磁盘文件进行一定程度上的合并,从而大幅度减少磁盘文件的数量,进而提升shuffle write的性能。

写出中间文件个数 = 上游的CPU核数 * 下游task的个数

shuffle read 阶段

就相当于mapreduce 的 shuffle read, 每个reducetask 拉取自己的数据。

由每个reducetask只要从上游stage的所在节点上,拉取属于自己的那一个磁盘文件即可。

弊端:

优化后的HashShuffleManager,虽然比优化前减少了很多小文件,但在处理大量数据时,还是会产生很多的小文件。

4. SortShuffleManager

Spark在引入Sort-Based Shuffle以前,比较适用于中小规模的大数据处理。为了让Spark在更大规模的集群上更高性能处理更大规模的数据,于是就引入了SortShuffleManager。

shuffle write阶段:

shuffle操作之前,数据会被划分为多个分区。每个分区被发往不同的executor进行计算。在map阶段,每个executor会根据key的hashCode值将数据进行分桶产生小文件。每个桶对应的一个下游分区。在每个桶中,数据会被按照key进行局部排序(这个操作不是必须的),排序后这些小文件会写入到内存中的一个大的shuffle文件。在写入shuffle文件的同时,会生成一个index索引文件。索引文件可以快速定位和读取所需要的键值对数据,而不需要扫描整个文件。

SortShuffleManager不会为每个Reducer中的Task生成一个单独的文件,相反,会把上游中每个mapTask所有的输出数据Data只写到一个文件中并使用了Index文件存储具体 mapTask 输出数据在该文件的位置。

因此 上游 中的每一个mapTask中产生两个文件:Data文件 和 Index 文件,其中Data文件是存储当前Task的Shuffle输出的,而Index文件中存储了data文件中的数据通过partitioner的分类索引。

写出文件数 = maptask的个数 * 2 (index 和 data )

可见,SortShuffle 的产生的中间文件的多少与 上个stage 的 maptask 数量有关

shuffle read 阶段:

下游的Stage中的Task就是根据这个Index文件获取自己所要抓取的上游Stage中产生的数据。

在sortShuffleManager中,我们可以启动byPass机制,不排序的机制。开关的值默认是mapTask的个数是200.
  
触发bypass机制的条件:

shuffle map task的数量小于spark.shuffle.sort.bypassMergeThreshold参数的值(默认200)或者不是聚合类的shuffle算子(比如groupByKey)

5. 总结

回顾整个Shuffle的历史,Shuffle产生的临时文件的数量的变化以此为:

Hash Shuffle:M*R;

Consolidate 方式的Hash Shuffle:C*R;

Sort Shuffle:2*M;

其中:M:上游stage的task数量,R:下游stage的task数量,C:上游stage运行task的CPU核数

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink高可用配置(HA)

从Flink架构中我们可以看到,JobManager这个组件非常重要,是中心协调器,负责任务调度和资源管理。默认情况下,每个Flink集群只有一个JobManager实例。这会产生单点故障(SPOF):如果JobManager崩溃,则无法提交新程序,正在运行的程序也会失败。通过JobManager的高可用性,…

Meta 发布Sapiens人类视觉模型,2D 姿势估计、人体分割、深度估计

meta提出了 Sapiens,人类基础视觉模型。这是一个以人为中心的视觉任务的模型。包括: 2D 姿势估计、人体部位分割、深度估计和表面法线预测。 此模型本身支持 1K 高分辨率推理,Sapiens在超过 3 亿张人类图像上预训练的模型进行微调&#xff0c…

NLP论文速读(EMNLP2024)|多风格可控生成的动态多奖励权重

论文速读|Dynamic Multi-Reward Weighting for Multi-Style Controllable Generation 论文信息: 简介: 本文探讨了文本风格在沟通中的重要性,指出文本风格传达了除原始语义内容之外的多种信息,如人际关系动态(例如正式…

鸿蒙中的Image组件如何引用网络图片

1.引用网络图片资源 引入网络图片需要申请权限ohos.permission.INTERNET,此时,Image组件的src参数为网络图片的链接,为了成功加载网络图片,您需要在module.json5文件中申请网络访问权限 注意:实际可用的时候&#xff0…

七天掌握SQL--->第七天:项目实践与总结

一、项目实践 1.1 项目背景 假设我们正在开发一个名为“在线图书管理系统”的项目。该项目旨在帮助图书馆管理员管理图书的借阅、归还、库存等操作,同时为读者提供一个便捷的图书查询和借阅平台。 1.2 数据库设计 1.2.1 需求分析 根据项目的需求,我…

【C++】IO库(三):string流

8.3 string 流 sstream 头文件定义了三个类型来支持内存 IO,这些类型可以向 string 写入数据,也可以从 string 读取数据,就像 string 是一个 IO 流一样。 istringstream 从 string 读数据;ostringstream 向 string 写入数据&…

React Hooks中use的细节

文档 useState useState如果是以函数作为参数,那要求是一个纯函数,不接受任何参数,同时需要一个任意类型的返回值作为初始值。 useState可以传入任何类型的参数作为初始值,当以一个函数作为参数进行传入的时候需要注意&#xff…

springboot 配置跨域访问

什么是 CORS? CORS,全称是“跨源资源共享”(Cross-Origin Resource Sharing),是一种Web应用程序的安全机制,用于控制不同源的资源之间的交互。 在Web应用程序中,CORS定义了一种机制&#xff0…

应用于蛋白-小分子柔性对接的等变VAE模型 - FlexPose 测评

FlexPose 应用于蛋白-小分子柔性对接场景下,能够在欧几里得空间中直接对蛋白-小分子复合结构的进行预测的等变神经网络模型,而无需传统的采样和评分策略。此模型考虑了蛋白氨基酸主链和侧链的柔性,会根据小分子的情况对氨基酸的侧链和主链进行…

【Web前端】如何构建简单HTML表单?

HTML 表单是 Web 开发中非常重要的组成部分。它们是与用户交互的主要方式,能够收集用户输入的数据。表单的灵活性使它们成为 HTML 中最复杂的结构之一,但若使用正确的结构和元素,可以确保其可用性和无障碍性。 表单的基本结构 HTML 表单使用…

Spring Boot英语知识分享网站:技术与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

乌班图单机(不访问外网)部署docker和服务的方法

面向对象:Ubuntu不能访问外网的机子,部署mysql、redis、jdk8、minio 过程: 1、安装docker(照着图去这里找对应的下载下来https://download.docker.com/linux/static/stable/),将7个docker官网下载的文件下载下来后,传上去服务器随便一个文件夹或者常用的opt或者/usr/lo…

IDEA全局设置-解决maven加载过慢的问题

一、IDEA全局设置 注意:如果不是全局设置,仅仅针对某个项目有效;例在利用网上教程解决maven加载过慢的问题时,按步骤设置却得不到解决,原因就是没有在全局设置。 1.如何进行全局设置 a.在项目页面,点击f…

狂野飙车8+(Asphalt 8+) for Mac 赛车竞速游戏 安装教程

Mac分享吧 文章目录 狂野飙车8(Asphalt 8) for Mac 赛车竞速游戏软件 效果图展示一、狂野飙车8(Asphalt 8) 赛车竞速游戏 Mac电脑版——v2.1.11️⃣:下载软件2️⃣:安装软件2.1 左侧安装包拖入右侧文件夹中,等待安装完成,运行软件…

标贝科技:自动驾驶中的数据标注类别分享

国内的自动驾驶行业正处于快速发展阶段。伴随随着芯片算力的提升、算法的优化以及数据采集标注传感设备的日益成熟,自动驾驶技术正逐步从实验室转向商业化应用。电车时代的来临,加速了自动驾驶时代的全面降临,23年国内汽车行业内卷的开始&…

(详细文档!)java swing学生信息管理系统 +mysql

第一章:系统功能分析 1.1、系统简介与开发背景 学生信息管理系统是在信息化时代,特别是在教育领域中产生的。随着学校规模的不断扩大和信息化技术的不断发展,传统的纸质档案管理方式已经无法满足学校对学生信息管理的需求,因此需…

JVM逃逸分析机制

JVM逃逸分析机制 简单来说,逃逸分析是分析了对象是否只在当前函数范围内使用,来确定是否在栈上进行分配,主要涉及到栈是函数运行完,立即清理的,所以不需要等到gc了,为了大大缓解了gc的压力。 一、定义 JVM…

【Petri网导论学习笔记】Petri网导论入门学习(十) —— 3.2 关联矩阵与状态方程

目录 3.2 关联矩阵与状态方程定义 3.3 关联矩阵引理 3.4引理 3.5定理 3.4例 3.7例 3.83.2 关联矩阵与状态方程 正如 Petri 网的一个标识可以表示成一个 $ m $ 维非负整数向量一样,Petri 网的结构也可以用一个矩阵来表示。这样,就可以引入线性代数的方法对 Petri 网的性质进行…

微信小程序常用全局配置项及窗口组成部分详解

微信小程序常用全局配置项及窗口组成部分详解 引言 微信小程序作为一种新兴的应用形态,凭借其轻量级、便捷性和丰富的功能,已成为开发者和用户的热门选择。在开发小程序的过程中,了解全局配置项和窗口组成部分是至关重要的。本文将详细介绍微信小程序的常用全局配置项及窗…

【H2O2|全栈】Node.js(1)

目录 前言 开篇语 准备工作 ES6导入导出 导入 有名导出 匿名导出 Node概念 Node导入导出 导入 有名导出 匿名导出 Node常用模块 path模块 和路径有关的全局变量 常见方法 导入方法 fs模块 常见方法 导入方法 结束语 前言 开篇语 本系列博客主要分享Java…