大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化

news2024/11/24 10:25:49

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(正在更新!)

章节内容

上节完成的内容如下:

  • Spark程序的优化:广播变量、累加器
  • 研究广播变量
  • 研究累加器

在这里插入图片描述

Standalone提交

Standalone组成

Standalone 模式下有四个重要的组成部分,分别是:

  • Driver: 用户编写的Spark应用程序就运行在Driver上,由Driver进程执行
  • Master:主要负责资源的调度和分配,并进行集群的监控等职责
  • Worker:Worker运行在集群中的一台服务器上,负责管理该节点上的资源,负责启动节点上的Executor
  • Executor:一个Worker上可以运行多个Executor,Executor通过启动多个线程(Task)对RDD的分区进行计算

SparkContext组件

什么是SparkContext

SparkContext 是 Spark 应用程序的主控制器,它负责与 Spark 集群的管理节点(Driver)和工作节点(Workers)进行交互。通过 SparkContext,用户可以提交作业、管理 RDD(弹性分布式数据集)和其他数据集,并执行各种操作。SparkContext 是 Spark 应用程序的基础,每个应用程序在启动时都会创建一个 SparkContext 实例。

SparkContext 的主要职责

  • 集群连接: SparkContext 负责连接到集群管理器(如 YARN、Mesos 或 Spark 的独立集群管理器),并获取集群的资源,以便在集群上执行任务。
  • 作业调度: SparkContext 通过 DAG(有向无环图)将用户的应用程序逻辑转换为一系列任务(Tasks),然后将这些任务分配给集群中的工作节点执行。
  • RDD 管理: RDD 是 Spark 的核心抽象,用于表示分布式数据集。SparkContext 提供了创建 RDD 的方法,如从外部存储系统(HDFS、S3 等)中加载数据,或者从 Scala 集合创建 RDD。
  • 广播变量和累加器: SparkContext 提供了广播变量和累加器的支持,广播变量用于在集群中的所有节点间共享只读数据,累加器用于在集群中执行全局计数或求和操作。
  • 检查点: 为了支持容错,SparkContext 提供了将 RDD 存储到可靠存储中的功能,这称为检查点。这样,在发生故障时,Spark 可以从检查点恢复 RDD。

SparkContext中的三大组件:

  • DAGScheduler:负责将DAG划分若干个Stage
  • TaskScheduler:将DAGScheduler提交的Stage(Taskset)进行优先排序,再将Task发送到Executor
  • SchedulerBackend:定义了许多与Executor事件相关的处理,包括:新的Executor注册进来的时候记录Executor的信息,增加全局的资源量(核数),Executor更新状态,若任务完成的话,回收Core,其他停止Executor、Remove Executor等事件

在这里插入图片描述

常用的 SparkContext 方法

  • parallelize: 将本地集合转换为 RDD。
  • textFile: 从文本文件中读取数据并创建 RDD。
  • stop: 停止 SparkContext。
  • broadcast: 创建广播变量。
  • accumulator: 创建累加器。

Standalone提交

  • 启动应用程序,完成SparkContext的初始化
  • Driver向Master注册,申请资源
  • Master检查集群资源状况,若集群资源满足,通知Worker启动Executor
  • Executor启动后向Driver注册(称为反向注册)
  • Driver完成DAG的解析,得到Tasks,然后向Executor发送Task
  • Executor向Driver汇总任务的执行情况
  • 应用程序执行完毕,回收资源

在这里插入图片描述

Shuffle原理

基本概念

Shuffle的本意是洗牌,目的是为了把牌弄乱。

  • Spark、Hadoop中的Shuffle可不是为了把数据弄乱,而是为了将随机排列的数据转换成具有一定规则的数据。
  • Shuffle是MapReduce计算框架中的一个特殊的阶段,介于Map和Reduce之间。
  • Shuffle涉及到了本地磁盘(非HDFS)的读写和网络传输,大多数Spark作业的性能都消耗在了Shuffle阶段,因此Shuffle性能的高低直接影响到了整个程序的运行效率

Shuffle历史

  • Spark 0.8 及以前 Hash Based Shuflle
  • Spark 0.8.1 为 Hash Based Shuflle 引入 File Consolidation 机制
  • Spark 0.9 引入 External Append Only Map
  • Spark 1.1 引入 Sort Based Shuffle,但默认仍为 Hash Based Shuffle
  • Spark 1.2 默认的 Shuffle方式改为 Sort Based Shuffle
  • Spark 1.4 引入 Tungsten-Sort Based Shuffle
  • Spark 1.6 Tungsten-Sort 并入 Sort Based Shuffle
  • Spark 2.0 Hash Based Shuffle 退出历史舞台

在这里插入图片描述

Hash Base Shuffle V1

简单介绍

Hash-based Shuffle 是 Apache Spark 中数据分布和重新排序的一种方式。Shuffle 是指在不同阶段的任务之间重新分配数据的过程。Hash-based Shuffle 在 Spark 1.x 版本中引入,被称为 Shuffle V1。
Shuffle V1 是 Spark 最初版本使用的 Shuffle 机制,基于 Hash 方法实现数据分布。它的主要特点是通过对数据的键进行哈希处理,将数据分配到相应的 reducer 节点上。Shuffle V1 的实现相对简单,但在大规模数据处理时存在一些局限性,如磁盘 I/O 过多、垃圾回收压力大等。

  • 每个 Shuffle Map Task 需要为每个下游的Task创建一个单独的文件
  • Shuffle 过程中会生成海量的小文件,同时打开过多的文件、IO效率低

在这里插入图片描述

工作原理

Map 端处理:

  • 每个 map 任务在完成后,会根据键的哈希值将数据划分到不同的 bucket 中,这些 bucket 对应下游的 reduce 任务。
  • Map 任务会将这些数据块(称为 partition)写入本地磁盘,并为每个 reduce 任务生成一个文件(包括索引文件和数据文件)。

Reduce 端处理:

  • 当 reduce 任务启动时,它会从所有 map 任务生成的输出中拉取对应的数据块。
  • Reduce 任务根据 map 任务输出的索引文件来读取相应的 partition 数据,并在本地进行聚合或其他处理。

局限性

  • 磁盘 I/O: 每个 map 任务为每个 reduce 任务生成单独的文件,这会导致大量的小文件和频繁的磁盘 I/O 操作。当集群规模和数据量增大时,I/O 开销变得非常大。
  • 垃圾回收: Shuffle V1 在处理过程中会产生大量的中间结果,导致 JVM 内存中会积累大量对象,增加了垃圾回收的压力,可能导致频繁的 GC 暂停(Stop-the-world)。
  • 容错性: 如果某个任务失败,Spark 需要重新计算该任务的所有中间结果,Shuffle V1 没有很好的机制来优化这一过程。

适用场景

尽管 Shuffle V1 存在一些问题,但在小规模数据处理或集群中,Shuffle V1 的性能表现还是可以接受的,特别是对资源消耗较少的作业。不过,随着数据规模的增大,Shuffle V1 的局限性会变得明显,因此后续的 Spark 版本引入了更优化的 Shuffle 机制(Shuffle V2 和 Tungsten-Sort Based Shuffle)。

Hash Base Shuffle V2

简单介绍

Hash-Based Shuffle V2 是 Apache Spark 中对最初版本的 Hash-Based Shuffle 进行的改进,旨在解决 Shuffle V1 中存在的一些性能和稳定性问题。Shuffle 是分布式计算中数据重新分布的重要机制,而 Shuffle V2 的引入大大提高了 Spark 在处理大规模数据集时的性能和效率。

核心思想

Hash Base Shuffle V2 核心思想:
允许不同Task复用同一批磁盘文件,有效将多个Task的磁盘文件进行一定程度上的合并,从而大幅度减少磁盘文件的数量,进而提升ShuffleWrite的性能,一定程度上解决了HashV1中的问题,但不彻底。
Hash Shuffle 规避了排序,提高了性能,总的来说在 Hash Shuffle过程中生成了海量的小文件
在这里插入图片描述

Shuffle V2 的改进点

合并输出文件:

  • 在 Shuffle V2 中,map 任务不再为每个 reduce 任务生成一个单独的文件,而是将多个 partition 的输出合并到一个文件中。这样,每个 map 任务只生成一个数据文件和一个索引文件,大大减少了生成的小文件数量。
  • 索引文件记录了每个 reduce 任务的数据在数据文件中的偏移量和长度,reduce 任务可以根据这个索引文件来定位它所需的数据。

磁盘 I/O 优化:

  • 通过合并输出文件,Shuffle V2 大幅减少了磁盘 I/O 操作,减少了文件系统的压力,并且降低了与小文件相关的元数据管理开销。

内存消耗优化:

  • 由于减少了文件数量,Shuffle V2 对 JVM 的内存压力也有所降低,垃圾回收(GC)的频率和时长得到了优化。

容错性改进:

  • Shuffle V2 采用了更加高效的数据管理机制,使得在任务失败时,重新拉取数据的开销更小。此外,数据文件的合并也使得在节点故障时可以更容易地恢复数据。
    工作原理

Shuffle V2 的工作原理

Map 端处理:

  • 每个 map 任务在处理数据时,基于键的哈希值将数据分配到不同的 partition。与 Shuffle V1 不同的是,Shuffle V2 将多个 partition 的数据写入同一个文件。
  • 同时生成一个索引文件,记录每个 partition 在数据文件中的位置和长度。
    Reduce 端处理:
  • Reduce 任务通过索引文件,定位需要处理的数据块,并从 Map 任务的输出文件中读取相应的数据。
  • 通过这种方式,减少了 I/O 开销,并优化了数据拉取的效率。

适用场景

Shuffle V2 适用于绝大多数的 Spark 作业,特别是在处理大规模数据集时效果尤为明显。它减少了磁盘 I/O 操作,优化了内存消耗,并提高了系统的容错性。对于需要高性能和稳定性的场景,Shuffle V2 是更好的选择。

Sort Base Shuffle

  • Sort Base Shuffle 大大减少了 Shuffle 过程中产生的文件数,提高 Shuffle 的效率。
  • Spark Shuffle 与 Hadoop Shuffle 从目的、意义、功能上看是类似的,实现上有区别。

在这里插入图片描述

RDD编程优化

RDD复用

避免创建重复的RDD,在开发过程中要注意,对于同一份数据,只应该创建一个RDD,不要创建过多个RDD来表示同一份数据。

RDD缓存/持久化

  • 当多次对同一个RDD执行算子操作时,每一次都会对这个RDD以之前的父RDD重新计算一次,这种情况是必须要避免的,对同一个RDD的重复计算是对资源的极大浪费
  • 对多次使用的RDD进行持久化,通过持久化将公共RDD的数据缓存到内存/磁盘中,之后对于公共RDD的计算都会从内存/磁盘中直接获取RDD数据
  • RDD的持久化是可以进行序列化的,当内存无法将RDD的数据完整的进行存放的时候,可以考虑使用序列化的方式减小数据的体积,将数据完整存储在内存中

巧用 filter

  • 尽可能过早地执行filter操作,过滤无用数据
  • 在filter过滤较多数据后,使用 coalesce 对数据进行重分区

使用高性能算子

  • 避免使用 groupByKey,根据场景选择使用高性能的聚合算子:reduceByKey、aggregateByKey
  • coalesce、repartition,在可能得情况下优先选择没有Shuffle的操作
  • foreachPartition 优化输出操作
  • map、mapPartition,选择合理的选择算子,mapPartitions性能更好,但数据量过大时可能会OOM
  • 用 repartitionAndSortWithinPartitions 替代 repartition + Sort 操作
  • 合理使用 cache、persist、checkpoint,选择合理的数据存储级别
  • filter 的使用
  • 减少对数据源的扫描(算法复杂)

设置合理的并行度

  • Spark作业中的并行度指各个Stage的Task的数量
  • 设置合理的并行度,让并行度与资源相匹配,简单来说就是在资源允许的前提下,并行度尽可能大,达到充分利用集群资源。

广播大变量

  • 默认情况下,Task中的算子中如果使用了外部变量,每个Task都会获取一份变量的副本,这会造多余的网络传输和内存消耗
  • 使用广播变量,只会在每个Executor保存一个副本,Executor的所有Task共用此广播变量,这样就节约了网络及内存资源

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

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

相关文章

盘古信息IMS MCM制造协同管理系统:为中小企业数字化转型量身打造的数字化方案

近年来,全球经济的不稳定性,给中小企业的经营和发展带来了巨大的挑战。为提升企业竞争力,中小企业纷纷谋求数字化转型路径,优化生产流程、提高运营效率、降低生产成本,以应对变幻莫测的市场环境。IMS MCM是盘古信息为广…

go中 panicrecoverdefer机制

go的defer机制-CSDN博客 常见panic场景 数组或切片越界,例如 s : make([]int, 3); fmt.Println(s[5]) 会引发 panic: runtime error: index out of range空指针调用,例如 var p *Person; fmt.Println(p.Name) 会引发 panic: runtime error: invalid m…

IT 人员配置的演变趋势:2024 年上半年的见解

随着我们深入研究 2024 年的动态格局,IT 人员配置领域在前六个月见证了几个值得注意的趋势和变化。 这些发展不仅反映了企业不断变化的需求,也凸显了技术对劳动力动态的变革性影响。 以下是在这个关键年份上半年塑造 IT 人员配置的一些关键趋势的详细介…

Python办公自动化smtplib实现自动发送邮件

学好python自动化,走遍天下都不怕!! 今天主要学习如何利用python自动化分析处理数据并以附件形式发送邮箱。需要安装配置python的运行环境,以及电脑支持Excel文件,有可以正常使用的邮箱。还需要用到python的第三方模块…

剧本杀门店预约小程序,提高消费者体验

当下,剧本杀行业一直处于活跃的状态,不管是线下聚会还是休闲娱乐,剧本杀游戏都是消费者的选择,剧本杀市场具有非常大的发展前景。 剧本杀门店预约系统是一个高效、便捷的游戏预约方式,能够帮助消费者便捷预约&#xf…

基于ssm的爱心捐赠管理系统的设计与实现(论文+源码)_kaic

摘 要 在互联网高速发展的现在,许多的办公与应用从传统的实体办理变为了在线处理。网购与网淘商品的浏览也从大街小巷变为了在线预览,从而使网上用户更好地对物品产生客观、全面立体的认知,并且对物品的对比也更加的省时省力。 爱心捐赠管…

一个简单的springboot项目(有源码)

开发一个springboot项目 代码迭代整合工具 gitee建模意义程序处理方式开发功能的步骤web服务网络状态码 web应用的开发分层springboot的作用 springboot框架搭建框架中各组件作用框架的演变如何提取hive中的表结构创建springboot 工程的引导模版 要选择aliyun ,否则…

java ssl使用自定义证书或忽略证书

1.证书错误 Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 2.生成客户端证书 openssl x509 -in <(openssl s_client -connect 192.168.11.19:8101 -prexit 2>/dev/null) -ou…

linux neo4j 切换知识图谱

neo4j 安装 linux neo4j的安装可以浏览这篇文章&#xff1a; ubuntu sudo apt-get install neo4j 配置安装与设置远程访问 引言 如果你是window用户&#xff0c;直接下载桌面版进行安装与使用即可&#xff1b; 我有一台linux的服务器&#xff0c;想部署在上面&#xff0c;不…

UE5.4内容示例(5)UI_CommonUI - 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例&#xff0c;可以用此熟悉一遍UE5的功能 UI_CommonUI可以看这个视频学习&#xff0c;此插件处于Beta状态&#xff0c;应用UI游戏方面&#xff0c;支持手柄等多输入端…

打饭-GYM

打饭 我还不信了&#xff0c;手动模拟一遍 再来了好看一点的图 ji12345a[i]21341120x3f0x3f0x3f0x3f0x3f114220x3f0x3f0x3f0x3f103520x3f0x3f0x3f0x3f9min(332,42)4020x3f0x3f0x3f8min(332,35)min(332,40)3190x3f0x3f7min(262,33)332490x3f0x3f6min(172,33)3120x3f0x3f0x3f5min…

【前端基础篇】JavaScript基础介绍

文章目录 前言初始JavaScriptJavaScript是什么发展历史JavaScript和HTML和CSS之间的关系JavaScript的运行过程JavaScript的组成 JavaScript的书写形式行内式内嵌式外部式注释 输入输出基础语法变量数据类型 运算符 JavaScript对象对象new关键字 常用对象数组创建数组数组操作函…

电影票api接口对接开发过程中需要注意什么?

电影票API接口对接过程需要考虑以下几个关键点&#xff1a; 1.了解API接口基础&#xff1a; 获取接口文档&#xff0c;理解其结构、请求方式、参数和返回数据格式。 2.接入流程&#xff1a; 使用API密钥或令牌进行身份验证。利用沙箱环境无风险测试。选择合适的编程语言实现…

Centos LVM磁盘合并方法

Centos LVM磁盘合并方法 使用fdisk -l命令查看机器增加了2块物理磁盘&#xff0c;一块40G另一块50G 需要将这两块盘的空间合并在一起&#xff0c;而且还需要动态扩展即在不关机的情况下操作 使用pvcreate将两块新增的物理磁盘加入物理卷 [rootlocalhost ~]# pvcreate /dev/sdb…

6G网络的关键技术、应用前景与挑战并存的科技征途

移动通信技术正以前所未有的速度迭代更新&#xff0c;而6G技术的研发与商用化进程渐渐成为了当前科技领域的热点与焦点。在5G技术尚未完全普及的今天&#xff0c;全球各国已纷纷将目光投向了更加充满想象的6G网络时代。本文将探讨全球6G研发的最新进展&#xff0c;特别是欧盟与…

Webots与ROS1、ROS2接口变迁-2024-

三大免费仿真器CoppeliaSim、Gazebo和Webots。 Gazebo接口总结&#xff1a; Gazebo与ROS1、ROS2接口变迁-2005-2024--CSDN博客 缺点&#xff1a;版本绑定策略 早期webots版本和ros版本绑定 后期&#xff0c;webots接口最新版本和ros特定版本最匹配。 例如&#xff1a; 最好按…

Ubuntu 中 SSH 服务的配置与原理详解

目录 1. 基本知识2. 配置步骤 1. 基本知识 一种用于在不安全的网络上安全登录和执行命令的协议 通过加密的方式保护通信数据&#xff0c;确保在传输过程中不被窃取或篡改 SSH 常用于远程登录服务器、传输文件以及执行命令 SSH 原理 公钥和私钥&#xff1a;SSH 使用公钥加密来…

UEFI 01记: 开发环境 在 ubuntu22 中搭建 edk2 开发环境并运行简单示例

https://uefi.org 1&#xff0c;预备环境 $ sudo apt install uuid-dev $ sudo apt install nasm $ sudo apt install bison flex $ sudo apt install build-essential $ sudo apt-get install x11proto-xext-dev $ sudo apt-get install libx11-dev $ sudo apt-get install l…

C语言回调函数进阶篇:全面总结与实战技巧

在C语言的编程世界中&#xff0c;回调函数是一种极其重要的概念。它提供了一种灵活的方式来编写可扩展和模块化的代码。本文将带你深入理解回调函数的原理&#xff0c;并通过一系列案例&#xff0c;系统且全面地总结回调函数的使用技巧。 一、回调函数解析 1.什么是回调函数&…

实战教程:Python实现高校爬虫,运用协同过滤与k-means算法进行专业评分分析

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…