《PySpark大数据分析实战》-08.宽窄依赖和阶段划分

📋 博主简介

  • 💖 作者简介:大家好,我是wux_labs。😜
    热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。
    通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP)、TiDB数据库认证SQL开发专家(PCSD)认证。
    通过了微软Azure开发人员、Azure数据工程师、Azure解决方案架构师专家认证。
    对大数据技术栈Hadoop、Hive、Spark、Kafka等有深入研究,对Databricks的使用有丰富的经验。
  • 📝 个人主页:wux_labs,如果您对我还算满意,请关注一下吧~🔥
  • 📝 个人社区:数据科学社区,如果您是数据科学爱好者,一起来交流吧~🔥
  • 🎉 请支持我:欢迎大家 点赞👍+收藏⭐️+吐槽📝,您的支持是我持续创作的动力~🔥

《PySpark大数据分析实战》-08.宽窄依赖和阶段划分

  • 《PySpark大数据分析实战》-08.宽窄依赖和阶段划分
    • 前言
    • 宽窄依赖和阶段划分
      • 窄依赖
      • 宽依赖
      • Shuffle洗牌
      • Stage划分
    • 结束语

《PySpark大数据分析实战》-08.宽窄依赖和阶段划分

前言

大家好!今天为大家分享的是《PySpark大数据分析实战》第2章第2节的内容:宽窄依赖和阶段划分。

宽窄依赖和阶段划分

前面介绍过Stage中Task的数量就是Stage的并行度,也是RDD的分区数,从Spark Driver Web UI中可以看到每个Stage有两个Task,意味着程序中处理的RDD有两个分区。在Spark中,RDD的数据是只读的,不支持修改操作,如果要更新RDD中的数据,则只能将原有的RDD经过转换生成一个新的RDD,这个过程中新RDD与原有的RDD就存在依赖关系。现在来了解一下任务执行的详细情况,将任务按代码拆分开来看,并使用glom算子为分区数据添加嵌套。

textFile()加载文件后的分区数是两个,第1个分区的数据是[‘Hello Python’, 'Hello Spark You ', ‘Hello Python Spark’],第2个分区的数据是[‘You know PySpark’],如图所示。

flatMap()扁平化数据之后的分区数是两个,第1个分区的数据是[‘Hello’, ‘Python’, ‘Hello’, ‘Spark’, ‘You’, ‘Hello’, ‘Python’, ‘Spark’],第2个分区的数据是[‘You’, ‘know’, ‘PySpark’],如图所示。

map()转换数据之后的分区数是两个,第1个分区的数据是[(‘Hello’, 1), (‘Python’, 1), (‘Hello’, 1), (‘Spark’, 1), (‘You’, 1), (‘Hello’, 1), (‘Python’, 1), (‘Spark’, 1)],第2个分区的数据是[(‘You’, 1), (‘know’, 1), (‘PySpark’, 1)],如图所示。

在整个过程中,分区数都是保持两个不变,注意每个单词所在的分区情况,无论数据如何变化,Hello、Python、Spark、You这4个单词总是保持在第1个分区, You、know、PySpark这3个单词总是保持在第2个分区。reduceByKey(…)根据key值进行聚合后的数据分区情况,第1个分区的数据是[(‘Hello’, 3), (‘Python’, 2), (‘Spark’, 2), (‘know’, 1), (‘PySpark’, 1)],第2个分区的数据是[(‘You’, 2)],如图所示。

从分区数据可以看出,reduceByKey依然是两个分区,但是know、PySpark两个单词已经不再包含在第2个分区,而是到了第1个分区,第1个分区中的单词You则到了第2个分区。数据在RDD中的流转过程如图所示。

textFile将文件加载成包含两个分区的RDD,在filterMap和map过程中,每个分区的数据总是保留在自己所在的分区进行流转,上一个RDD的一个分区的数据完全流转到下一个RDD的一个分区,下一个RDD的一个分区的数据完全来自上一个RDD的一个分区,也就是子RDD的一个分区的数据仅依赖于父RDD的一个分区。在reduceByKey过程中,上一个RDD的一个分区的数据分别流向了下一个RDD的两个分区,而下一个RDD的一个分区的数据则同时来自于上一个RDD的两个分区,也就是子RDD的一个分区的数据依赖于父RDD的所有分区。

窄依赖

当父RDD的一个分区的数据仅流向子RDD的一个分区,在Spark中被称为窄依赖,filterMap、map算子是窄依赖的算子。窄依赖过程简单,不同分区的数据互不影响,可以并行执行,是最好进行优化的部分。

宽依赖

当父RDD的一个分区的数据流向子RDD的多个分区,在Spark中被称为宽依赖,reduceByKey算子是宽依赖的算子。宽依赖涉及到Shuffle,子RDD的数据需要依赖所有父RDD的Shuffle过程完成才能继续往下处理,因此过程复杂,优化相对复杂。

Shuffle洗牌

Hadoop中的MapReduce是计算向数据靠拢的,数据块在HDFS的哪个节点上就会在哪个节点上启动计算任务,但有些计算需要将各个节点上的同一类数据汇集到某一个节点进行计算,把这些分布在不同节点的数据按照一定的规则汇集到一起的过程称为Shuffle。在Hadoop中Shuffle是连接Map任务和Reduce任务的桥梁,Map任务的输出需要经过Shuffle过程才被作为Reduce过程的输入。Spark中的Shuffle过程与Hadoop的Shuffle过程十分类似,案例中的单词You存在于RDD的两个分区,也就有可能存在于HDFS的两个节点上,而最终输出结果单词You汇集在了同一个分区,这个过程就涉及Shuffle,Shuffle过程就会产生宽依赖。reduceByKey算子是需要进行Shuffle的。

Stage划分

Spark应用程序提交后,Spark引擎会根据提交的代码先生成一个有向无环图DAG,即代码的执行计划,Spark基于DAG进行流程的调度。在进行调度之前,Spark会对整个流程做Stage的划分,根据DAG中的RDD的依赖关系从后往前推,当遇到Shuffle过程,也就是宽依赖的地方,就拆分出一个新的Stage,当遇到窄依赖的地方,就将父RDD加入到当前的Stage中,Spark划分Stage的依据就是宽依赖。案例代码中Spark中Stage的划分情况如图所示。

结束语

好了,感谢大家的关注,今天就分享到这里了,更多详细内容,请阅读原书或持续关注专栏。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

express 下搞一个 websocket 长连接

安装模块 npm i express npm i express-ws 新建文件app.js 先安排源码 监听端口 7777 var express require(express) var app express() require(express-ws)(app)var port 7777 var clientObject {} app.ws(/, (client, req) > {// 连接var key req.socket.re…

运筹学经典问题(七):旅行商问题(TSP)

问题描述 给定一系列城市和每对城市之间的距离,求解访问每座城市一次并回到起始城市的最短回路。 数学建模 集合: V V V:城市集合 常量: c i j c_{ij} cij​:城市 i i i到城市 j j j之间距离, i ≠ j i \neq j i…

基于C++的简单BP神经网络(C++)

需求:在某些无网络的实验机器上,由于某些任务需求,需要拟合特定的函数,因此需要部署基于C开发的神经网络,本文在不使用外部库的情况下,编写简单的神经网络,实现简单函数的拟合。 一、简介 本文…

我常用的几个经典Python模块

Python常用的模块非常多,主要分为内置模块和第三方模块两大类,且不同模块应用场景不同又可以分为文本类、数据结构类、数学运算类、文件系统类、爬虫类、网络通讯类等多个类型。 大家常用的内置模块比如:math、re、datetime、urllib、os、ra…

CountDownLatch用法、详解

目录 ​编辑 概述: 应用场景: 优点: 缺点: 主要方法: 1. CountDownLatch(int count): 2. void await(): 3. boolean await(long timeout, TimeUnit unit): 4. void countDo…

【Python】计算一年内的总天数(还有跨年日期)

花了一段时间才找到Python中求一年中总日数(total day of the Year)的格式代码,所以也把计算方法记录下来。 基本 首先,简单地找出一年中的总天数, strftime() 和 strptime() 的格式代码是 %j ↓看这里 使用 strft…

基于当前实时云渲染的特点,用户体验主要受哪些因素影响?

在回答这个问题之前我们首先需要理解什么是实时云渲染? 点量实时云渲染是一种基于云计算低延迟传输,实现各种轻终端便捷使用云端大型软件和3D应用的一种云技术解决方案。这一技术解决方案通过将应用程序或内容置于云端服务器上运行,然后以视…

测试用例设计方法六脉神剑——第四剑:石破天惊,功能图法攻阵

1 引言 前面几篇文章为我们讲述了因果图、判定表、正交试验等几种方法,主要是针对于不同条件输入输出的组合进行测试,但在实际需求中,我们也常会遇到需要对被测对象的状态流转进行验证的情况,此时前面几种方法将不再适用&#xf…

测试用例设计方法:功能图

1 引言 前面几篇文章为我们讲述了因果图、判定表、正交试验等几种方法,主要是针对于不同条件输入输出的组合进行测试,但在实际需求中,我们也常会遇到需要对被测对象的状态流转进行验证的情况,此时前面几种方法将不再适用&#xf…

OpenHarmony 鸿蒙系统之开发环境安装

一、首先在下方链接网址中下载DevEco Studio的安装包。 DevEco Studio历史版本下载-HarmonyOS应用开发官网

Linux CentOS7 Docker安装Jenkins

1 sudo yum update #确保yum包更新到最新 service network restart #重启网络 2、查询镜像 docker search jenkins 3、拉取镜像 docker pull jenkins/jenkins #拉取镜像 4、创建Jenkins工作目录,并将容器内目录挂载到此目录…

23.12.10日总结

周总结 这周三的晚自习,学姐讲了一下git的合作开发,还有懒加载,防抖,节流 答辩的时候问了几个问题: 为什么在js中0.10.2!0.3? 在js中进行属性运算时,会出现0.10.20.300000000000000004js遵循IEEE754标…

CSS伪元素的特殊机制

概念 伪元素是CSS中的一种特殊机制,用于在元素的特定位置插入虚拟的内容。它们不是实际存在于HTML文档中的元素,而是通过CSS样式来创建和控制的。 伪元素使用双冒号(::)作为标识符,用于区分伪类选择器(使…

Linux Shell——基本语法(变量、流程控制)

shell基本语法 一、变量二、流程控制 总结 最近学习了shell脚本,记录一下相关语法 一、变量 变量是很重要的,是用于存储数据值的容器 变量名要遵循以下规则: (1)只能包含字母、数字和下划线 (2&#xff09…

鸿蒙开发组件之Web

一、加载一个url myWebController: WebviewController new webview.WebviewControllerbuild() {Column() {Web({src: https://www.baidu.com,controller: this.myWebController})}.width(100%).height(100%)} 二、注意点 2.1 不能用Previewer预览 Web这个组件不能使用预览…

Android camera的metadata

一、实现 先看一下metadata内部是什么样子: 可以看出,metadata 内部是一块连续的内存空间。 其内存分布大致可概括为: 区域一 :存 camera_metadata_t 结构体定义,占用内存 96 Byte 区域二 :保留区&#x…

Linux install manual 1Panel

前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。1Panel 的功能和优势包括: 快速建站:深度集成 Wordpress 和 Halo,域名绑定、SSL 证书配置等一键搞定;高效管理:通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等;安全可…

Qt图像处理-Qt中配置OpenCV打开本地图片

本文讲解Qt中配置OpenCV过程并用实例展示如何使用OpenCV打开图片(windows环境下) 一、下载OpenCv 本文使用版本OpenCV-MinGW-Build-OpenCV-3.4.5 下载地址: https://codeload.github.com/huihut/OpenCV-MinGW-Build/zip/refs/heads/OpenCV-3.4.5 点击Code-local-Downlo…

大模型的实践应用13-量化后的通义千问Qwen的18亿参数在CPU上的部署,最小2GB显存可跑,并利用两种文本流式方式输出

大家好,我是微学AI,今天给大家介绍大模型的实践应用13-量化后的通义千问Qwen的18亿参数在CPU上的部署,最小2GB显存可跑,并利用两种文本流式方式输出。Qwen-1_8B-Chat是阿里云研发的通义千问大模型系列的18亿参数规模的模型。Qwen-1.8B是基于Transformer的大语言模型, 在超大…

LabVIEW进行癌症预测模型研究

LabVIEW进行癌症预测模型研究 癌症是一种细胞异常增生的疾病。随着年龄的增长,细胞分裂速度放缓,但癌细胞会失去控制地不断分裂,形成可能良性或恶性的肿瘤。 2012年的国际癌症数据显示,新发癌症病例和癌症相关死亡人数有所增加。…