Spark Core内核调度机制详解(第5天)

系列文章目录

  1. 如何构建DAG执行流程图 (掌握)
  2. 如何划分Stage阶段 (掌握)
  3. Driver底层是如何运转 (掌握)
  4. 确定需要构建多少分区(线程) (掌握)

文章目录

  • 系列文章目录
  • 引言
  • 一、Spark内核调度(掌握)
      • 1.1、内容概述
      • 1.2、RDD的依赖
      • 1.3、DAG和Stage
      • 1.4、Spark Shuffle
      • 1.5、Job调度流程
      • 1.6、Spark RDD并行度
  • 二. 常见面试题
      • 1.简单介绍下RDD宽依赖和窄依赖的区别
      • 2.简单介绍下DAG有向无环图如何划分Stage阶段的
      • 3.请描述下rdd中job的整个调度流程

引言

本文主要介绍了
1.RDD的依赖
2.DAG和Stage
3.Spark Shuffle
4.job调度流程(掌握)
5.Spark RDD并行度
帮助读者更好地理解其工作原理和优化方法。


一、Spark内核调度(掌握)

1.1、内容概述

Spark内核调度的任务:

  • 如何构建DAG执行流程图
  • 如何划分Stage阶段
  • Driver底层是如何运转
  • 确定需要构建多少分区(线程)

Spark内核调度的目的:尽可能用最少的资源高效地完成任务计算。

1.2、RDD的依赖

RDD依赖:一个RDD的形成可能是由一个或者多个RDD得到的,此时这个RDD和之前的RDD之间产生依赖关系。

在Spark中,RDD之间的依赖关系,主要有二种类型:

  • 窄依赖
  1. 作用: 能够让Spark程序并行计算。也就是一个分区数据计算出现问题以后,其他的分区计算不受到任何影响。
  2. 特点: 父RDD的分区和子RDD的分区关系是一对一的关系。也就是父RDD分区的数据会整个被下游子RDD的分区接收。

在这里插入图片描述

  • 宽依赖
  1. 作用: 划分Stage的重要依据。宽依赖也叫做Shuffle依赖。
  2. 特点: 父RDD的分区和子RDD的分区关系是一对多的关系,也就是父RDD的分区数据会被分成多份给到下游子RDD的多个分区所接收。
  3. 注意:为了避免数据不完整,如果有宽依赖,shuffle下游的其他操作,必须等待shuffle执行完成以后才能够继续执行。

在这里插入图片描述

  • 说明
    1. 在实际使用中,不需要纠结哪些算子会存在shuffle,以需求为目标。虽然shuffle的存在会影响一定的效率, 但是以完成任务为准则,该用那个算子,就使用那个算子即可,不要过分纠结
    2. 算子中一般以ByKey结尾的会发生shuffle另外是重分区算子也会发生shuffle。

1.3、DAG和Stage

  • DAG:有向无环图,主要描述一段执行任务,从开始一直往下走,不允许出现回调操作,Spark应用程序中,遇到一个Action算子,就会触发形成一个Job任务的产生。

  • 思考:对于每一个Job的任务,都会产生一个DAG执行流程图,那么这个流程图是如何形成的呢?

层级关系:
1- 一个application应用程序 -> 遇到一个Action算子,就会触发形成一个Job任务
2- 一个Job任务只有一个DAG有向无环图
3- 一个DAG有向无环图 -> 有多个Stage
4- 一个Stage -> 有多个Task线程5- 一个RDD -> 有多个分区
6- 一个分区会被一个Task线程所处理
  • DAG执行流程图形成和Stage划分
    在这里插入图片描述
1- Spark应用程序遇到Action算子后,就会触发一个Job任务的产生。Job任务会将它所依赖的所有算子全部加载进来,形成一个Stage。2- 接着从Action算子从后往前进行回溯,遇到窄依赖就将算子放在同一个Stage当中;如果遇到宽依赖,就划分形成新的Stage,最后一直回溯完成。
  • 细化剖析Stage内部的流程
    在这里插入图片描述
  • 默认并行度的值确认
因为是使用textFile读取HDFS上的文件,因此RDD分区数=max(文件的block块的数量, defaultMinPartition),继续需要知道defaultMinPartition的值是多少。defaultMinPartition=min(spark.default.parallelism,2)取最小值。最终我们确认spark.default.parallelism的参数值就能够最终确认RDD的分区数有多少个。spark.default.parallelism参数值确认过程如下:
1- 如果有父RDD,就取父RDD的最大分区数
2- 如果没有父RDD,根据集群模式进行取值:2.1- 本地模式:机器的最大CPU核数2.2- (了解)Mesos:默认是82.3- 其他模式:所有执行节点上的核总数或2,以较大者为准

1.4、Spark Shuffle

  • Spark中shuffle的发展历程
1- 在1.1版本以前,Spark采用Hash shuffle (优化前 和 优化后)2- 在1.1版本的时候,Spark推出了Sort Shuffle3- 在1.5版本的时候,Spark引入钨丝计划(优化为主)4- 在1.6版本的时候,将钨丝计划合并到sortShuffle中5- 在2.0版本的时候,将Hash Shuffle移除,将Hash shuffle方案移植到Sort Shuffle

在这里插入图片描述

  • 未优化的Hash shuffle
    在这里插入图片描述

  • 存在的问题
    上游(map端)的每个Task会产生与下游Task个数相等的小文件个数。这种情况会导致上游有非常多的小文件。另外,下游(reduce端)来拉取文件的时候,会有大量的网络IO和磁盘IO过程,因为要打开和读取多个小文件。

  • 经过优化后的Hash shuffle
    在这里插入图片描述
    变成了由每个Executor进程产生与下游Task个数相等的小文件数。这样可以大量减小小文件的产生,以及降低下游拉取文件时候的网络IO和磁盘IO过程。

  • Sort shuffle
    在这里插入图片描述

Sort Shuffle分成了两种: 普通机制和bypass机制。具体使用哪种,由Spark底层决定。普通机制的运行过程: 每个上游Task线程处理数据,数据处理完以后,先放在内存中。接着对内存中的数据进行分区、排序。将内存中的数据溢写到磁盘,形成一个个的小文件。溢写完成以后,会将多个小文件合并成一个大的磁盘文件。并且针对每个大的磁盘文件,会提供一个索引文件。接着是下游Task根据索引文件来读取相应的数据。bypass机制: 就是在普通机制的基础上,省略了排序的过程bypass机制的触发条件是:
1- 上游RDD的分区数量最多不能超过200个
2- 上游不能对数据进行提前聚合操作(因为提前聚合,需要先进行分组操作,而分组的操作实际上是有排序的操作)

1.5、Job调度流程

  • 主要是讨论:在Driver内部,是如何调度任务
    在这里插入图片描述
1- Driver进程启动后,底层PY4J创建SparkContext顶级对象。在创建该对象的过程中,还会创建另外两个对象,分别是: DAGScheduler和TaskSchedulerDAGScheduler: DAG调度器。将Job任务形成DAG有向无环图和划分Stage的阶段TaskScheduler: Task调度器。将Task线程分配给到具体的Executor执行2- 一个Spark程序遇到一个Action算子就会触发产生一个Job任务。SparkContext将Job任务给到DAG调度器,拿到Job任务后,会将Job任务形成DAG有向无环图和划分Stage的阶段。并且会确定每个Stage阶段有多少个Task线程,会将众多的Task线程放到TaskSet的集合中。DAG调度器将TaskSet集合给到Task调度器3- Task调度器拿到TaskSet集合以后,将Task分配给到给到具体的Executor执行。底层是基于SchedulerBackend调度队列来实现的。4- Executor开始执行任务。并且Driver会监控各个Executor的执行状态,直到所有的Executor执行完成,就认为任务运行结束5- 后续过程和之前一样

1.6、Spark RDD并行度

  • 整个Spark应用中,影响并行度的因素有以下两个原因:
    1- 资源的并行度: Executor数量 和 CPU核心数 以及 内存的大小。
    2- 数据的并行度: Task的线程数 和 分区数量。
一般将Task线程数设置为CPU核数的2-3倍。另外每个线程分配3-5GB的内存资源。
  • 如何设置并行度
语法: SparkConf().set("spark.default.parallelism", "num")说明: spark.default.parallelism该参数是SparkCore中的参数。
该参数只会影响shuffle以后的分区数量。
另外该参数对parallelize并行化本地集合创建的RDD不起作用。
  • 代码演示
# 导包
from pyspark import SparkContext, SparkConf
import os# 绑定指定的python解释器
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'
if __name__ == '__main__':# 6.1 TODO: 设置并行度conf = SparkConf().set('spark.default.parallelism', '6')# - 1.创建SparkContext对象sc = SparkContext(conf=conf)# - 2.数据输入textRDD = sc.textFile('file:///export/data/spark_project/spark_base/content.txt')# - 3.数据处理#   - 3.1文本内容切分flatMapRDD = textRDD.flatMap(lambda line: line.split(" "))#   - 3.2数据格式转换mapRDD = flatMapRDD.map(lambda word: (word, 1))# 6.2 TODO: shuffle之前查看分区数量print(f"shullfe之前分区数: {mapRDD.getNumPartitions()},分区内容:{mapRDD.glom().collect()}")#   - 3.3分组和聚合reduceRDD = mapRDD.reduceByKey(lambda agg, curr: agg + curr)# 6.3 TODO: shuffle之后查看分区数量print(f"shullfe之后分区数: {reduceRDD.getNumPartitions()},分区内容:{reduceRDD.glom().collect()}")# - 4.数据输出# print(reduceRDD.collect())# - 5.释放资源sc.stop()

二. 常见面试题

1.简单介绍下RDD宽依赖和窄依赖的区别

--- 窄依赖(Narrow Dependency)
1- 定义:每一个父RDD的分区最多被子RDD的一个分区所使用。这通常表现为一对一(OneToOneDependencies)或多对一(多个父RDD的分区对应于一个子RDD的分区)的关系。
2- 操作示例:map、filter、union等操作会产生窄依赖。这些操作的特点是,子RDD的每个分区都是基于父RDD的一个或多个特定分区计算得出的。
3- 容错处理:当窄依赖的子RDD数据丢失时,由于父RDD的一个分区只对应一个子RDD分区,因此只需要重新计算与子RDD分区对应的父RDD分区即可。
4- 优化特性:窄依赖可以进行流水线优化,利用fork/join机制,一个作业可以直接一个阶段完成,形成管道型的流水化处理。
--- 宽依赖(Wide Dependency 或 Shuffle Dependency)
1- 定义:子RDD的每一个分区都会使用所有父RDD的所有分区或多个分区。这通常表现为一对多(OneToManyDependencies)的关系。
2- 操作示例:groupByKey、reduceByKey、sortedByKey等操作会产生宽依赖。这些操作的特点是,子RDD的每个分区都可能依赖于父RDD的所有分区。
3- 容错处理:当宽依赖的子RDD数据丢失时,由于一个分区的数据通常由多个父RDD分区数据变换而来,因此可能需要重新计算父RDD的所有分区才能恢复数据。
4- 优化限制:宽依赖通常涉及shuffle操作,需要将数据写入磁盘并等待,因此无法形成管道型的流水化处理。
  • 总结
    数据流动:窄依赖的数据流动是线性的,而宽依赖的数据流动是跨多个分区的。
    容错处理:窄依赖的容错处理更为高效,只需要重新计算部分数据;而宽依赖的容错处理可能涉及大量数据的重新计算。
    优化特性:窄依赖可以进行流水线优化,而宽依赖通常不能。
    Shuffle操作:宽依赖通常伴随着shuffle操作,而窄依赖则没有。
    以上是对RDD宽依赖和窄依赖的简要介绍和区别分析。

2.简单介绍下DAG有向无环图如何划分Stage阶段的

  • 1- Spark应用程序遇到Action算子后,就会触发一个Job任务的产生。Job任务会将它所依赖的所有算子全部加载进来,形成一个Stage。

  • 2- 接着从Action算子从后往前进行回溯,遇到窄依赖就将算子放在同一个Stage当中;如果遇到宽依赖,就划分形成新的Stage,最后一直回溯完成。

3.请描述下rdd中job的整个调度流程

1- Driver进程启动后,底层PY4J创建SparkContext顶级对象。在创建该对象的过程中,还会创建另外两个对象,分别是: DAGScheduler和TaskSchedulerDAGScheduler: DAG调度器。将Job任务形成DAG有向无环图和划分Stage的阶段TaskScheduler: Task调度器。将Task线程分配给到具体的Executor执行2- 一个Spark程序遇到一个Action算子就会触发产生一个Job任务。SparkContext将Job任务给到DAG调度器,拿到Job任务后,会将Job任务形成DAG有向无环图和划分Stage的阶段。并且会确定每个Stage阶段有多少个Task线程,会将众多的Task线程放到TaskSet的集合中。DAG调度器将TaskSet集合给到Task调度器3- Task调度器拿到TaskSet集合以后,将Task分配给到给到具体的Executor执行。底层是基于SchedulerBackend调度队列来实现的。4- Executor开始执行任务。并且Driver会监控各个Executor的执行状态,直到所有的Executor执行完成,就认为任务运行结束5- 后续过程和之前一样

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

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

相关文章

Dockerfile封装制作pytorch(tensorflow)深度学习框架 + jupyterlab服务 + ssh服务镜像

一:docker-hub官网寻找需求镜像 1.我们在https://hub.docker.com/官网找到要封装的pytorch基础镜像,这里我们以pytorch1.13.1版本为例 2.我们找到的这个devel版本的镜像(我们需要cuda的编译工具) pytorch版本是1.13.1,…

网络校时服务器:铁路对时有妙招

在信息高速发展的今天,铁路作为国家的经济大动脉,与广大市民生活息息相关,担负着运送大流量乘客、保证交通畅通的重任,为了保证列车的正点运行和乘客的行程,对时间精准度的要求是非常严格的。随着我国铁路的发展速度和…

【CRASH】freelist异常导致的异常地址访问

freelist异常导致的异常地址访问 问题现象初步分析继续深入新的发现沙盘推演寻找元凶分析代码后记 问题现象 项目一台设备几天内出现了两次crash,都是异常地址访问导致。 [66005.261660] BUG: unable to handle page fault for address: ffffff8881575110初步分析…

AOSP平台开发的利器——Android Studio for Platform

Android Studio for Platform (ASfP) 是一个为使用 Soong 构建系统构建的 Android 开源项目(AOSP)平台开发者而设计的 Android Studio IDE 版本。与标准 Android Studio 不同,ASfP 具有多语言支持,可以在同一 IDE 中编写 C、Kotli…

分页插件bs_pagination与Bootstrap4、jQuery3.7.1不兼容的问题

问题场景: 开发环境: 项目:CRM IDE:intelij IDEA JDK: jdk21.0.2 JQuery:3.7.1 Bootstrap:4.6 项目中需要查询数据库中的数据,并且以分页显示的方式显示在页面上,前端页面用到了分页…

新书速览|Ubuntu Linux运维从零开始学

《Ubuntu Linux运维从零开始学》 本书内容 Ubuntu Linux是目前最流行的Linux操作系统之一。Ubuntu的目标在于为一般用户提供一个最新的、相当稳定的、主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。《Ubuntu Linux运…

高效、智能、安全:小型机房EasyCVR+AI视频综合监控解决方案

一、背景需求分析 随着信息技术的迅猛发展,小型机房在企事业单位中扮演着越来越重要的角色。为了确保机房的安全稳定运行,远程监控成为了必不可少的手段。 二、视频监控 视频监控是机房远程监控的重要组成部分。通过安装IP摄像机及部署视频监控系统Ea…

11.【机器学习】十大算法之一随机森林算法原理讲解

【机器学习】十大算法之一随机森林算法原理讲解 一摘要二个人简介三什么是随机森林?3.1 决策树3.2 集成方法3.2.1 Bagging方法3.2.2 Boosting方法 3.3 随机森林算法3.4 随机的含义 四案例演示一4.1 利用随机森林进行特征选择,然后使用SVR进行训练4.2 利用…

qt事件和连接TCP协议

QT网络聊天室服务器实现 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this))//给服务器指针实例化一个空间 {ui->setupUi(this); }Widget::~Widget() {d…

『Z-Weekly Feed 08』加密资产观 | FHE应用前景 | OPAL协议

一位机构投资者的加密资产观 作者:Hongbo 01 💡TL;DR 在加密投资领域如何找到真正的“价值”:Crypto 作为一种新兴资产,应该找到一种区别于传统公司股票资产的估值方法,本文重点阐述了加密货币作为新的资产类型与传统资…

Artalk-CORS,跨域拦截问题

今天重新部署Artalk之后,遇到了CORS——跨域拦截的问题,卡了好一会记录一下。 起因 重新部署之后,浏览器一直提示CORS,之前在其他项目也遇到过类似的问题,原因就在于跨域问题。

Docker私有化仓库Harbor安装流程

1.搭建Docker私有仓库主要有以下几种方式 使用Docker官方提供的Registry镜像:Docker官方提供了一个用于构建私有镜像仓库的Registry镜像,只需将镜像下载并运行容器,然后暴露5000端口即可使用。可以通过修改Docker的配置文件daemon.json&#…

C# WPF入门学习主线篇(二十二)—— 样式(Styles)的定义和应用

C# WPF入门学习主线篇(二十二)—— 样式(Styles)的定义和应用 欢迎来到C# WPF入门学习系列的第二十二篇。本篇文章将详细介绍WPF中的样式(Styles)的定义和应用。样式在WPF中起到重要作用,通过样…

西木科技Westwood-Robotics人型机器人Bruce配置和真机配置

西木科技Westwood-Robotics人型机器人Bruce配置和真机配置 本文内容机器人介绍Bruce机器人Gazebo中仿真代码部署Bruce真机代码部署 本文内容 人形机器人Brcue相关介绍docker中安装Gazebo并使用Bruce机器人控制器更换环境配置 机器人介绍 公司:西木科技Westwood-R…

milvus元数据解析工具milvusmetagui介绍使用

简介 milvusmetagui是一款用来对milvus的元数据进行解析的工具,milvus的元数据存储在etcd上,而且经过了序列化,通过etcd-manager这样的工具来查看是一堆二进制乱码,因此开发了这个工具对value进行反序列化解析。 在这里为了方便交…

高速公路收费图片分析系统深入理解

当今社会,随着交通运输业的快速发展,高速公路已成为人们出行的重要选择。而高速公路收费系统作为保障道路可持续运营的重要组成部分,其效率和准确性对于保障道路畅通和交通安全至关重要。近年来,随着技术的不断进步,高…

DSP28335:定时器

1.定时器介绍 1.1 定时器工作原理 TMS320F28335的CPU Time有三个,分别为Timer0,Timer1,Timer2,其中Timer2是为操作系统DSP/BIOS保留的,当未移植操作系统时,可用来做普通的定时器。这三个定时器的中断信号分…

读AI新生:破解人机共存密码笔记06人工智能生态系统

1. 深蓝 1.1. “深蓝”的胜利虽然令人印象深刻,但它只是延续了几十年来显而易见的趋势 1.2. 国际象棋算法的基本设计是由克劳德香农在1950年提出的 1.2.1. 这一基本设计在20世纪60年代初实现了重大改进 1.2.2. 最优秀的国际象棋程序的等级评分稳步提高&#xff…

【漏洞复现】致远OA webmail.do 任意文件下载 (CNVD-2020-62422)

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

YOLOv10改进 | 注意力篇 | YOLOv10引入EMAttention(EMA)注意力

1. EMA介绍 1.1 摘要:在各种计算机视觉任务中说明了通道或空间注意机制在产生更可辨别的特征表示方面的显着有效性。 然而,通过通道降维来建模跨通道关系可能会给提取深度视觉表示带来副作用。 本文提出了一种新型高效的多尺度注意力(EMA)模块。 着眼于保留每个通道的信息…