聊聊Spark中的宽依赖和窄依赖

2024-09-06 05:38
文章标签 依赖 spark 聊聊

本文主要是介绍聊聊Spark中的宽依赖和窄依赖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开门见山,本文就针对一个点,谈谈Spark中的宽依赖和窄依赖,这是Spark计算引擎划分Stage的根源所在,遇到宽依赖,则划分为多个stage,针对每个Stage,提交一个TaskSet:

上图:一张网上的图:

基于此图,分析下这里为什么前面的流程都是窄依赖,而后面的却是宽依赖:

我们仔细看看,map和filter算子中,对于父RDD来说,一个分区内的数据,有且仅有一个子RDD的分区来消费该数据。

同样,UNION算子也是同样的:

所以,我们判断窄依赖的依据就是:父类分区内的数据,会被子类RDD中的指定的唯一一个分区所消费:

这是很重要的:

面试的时候,面试官问到了一个问题,如果父类RDD有很多的分区,而子类RDD只有一个分区,我们可以使用repartition或者coalesce算子来实现该效果,请问,这种实现是宽依赖?还是窄依赖?

如果从网上流传的一种观点:子RDD一个partition内的数据依赖于父类RDD的所有分区,则为宽依赖,这种判断明显是错误的:

别笑,网上的确有这种说法,我差点栽了跟头,这种解释实质上是错误的,因为如果我们的reduceTask只有一个的时候,只有一个分区,这个分区内的数据,肯定依赖于所有的父类RDD:

毫无疑问,这是个窄依赖:

相对之下,什么是宽依赖呢?

宽依赖,指的是父类一个分区内的数据,会被子RDD内的多个分区消费,需要自行判断分区,来实现数据发送的效果:

总结一下:

窄依赖:父RDD中,每个分区内的数据,都只会被子RDD中特定的分区所消费,为窄依赖:

宽依赖:父RDD中,分区内的数据,会被子RDD内多个分区消费,则为宽依赖:

这里,还存在一个可能被挑刺的地方,比如说父类每个分区内都只有一个数据,毫无疑问,这些数据都会被唯一地指定到子类的某个分区内,这是窄依赖?还是宽依赖?

这时候,可以从另外一个角度来看问题:

每个分区内的数据,是否能够指定自己在子类RDD中的分区?

如果不能,那就是宽依赖:如果父RDD和子RDD分区数目一致,那基本就是窄依赖了:

总之,还是要把握住根本之处,就是父RDD中分区内的数据,是否在子类RDD中也完全处于一个分区,如果是,窄依赖,如果不是,宽依赖。

这篇关于聊聊Spark中的宽依赖和窄依赖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

PHP7扩展开发之依赖其他扩展

前言 有的时候,我们的扩展要依赖其他扩展。比如,我们PHP的mysqli扩展就依赖mysqlnd扩展。这中情况下,我们怎么使用其他扩展呢?这个就是本文讲述的内容。 我们新建立一个扩展,名字叫 demo_dep , 依赖之前的say扩展。 在demo_dep扩展中,我们实现demo_say方法。这个方法调用say扩展的say方法。 代码 基础代码 确保say扩展的头文件正确安装到了php

Go 依赖注入库dig

简介 今天我们来介绍 Go 语言的一个依赖注入(DI)库——dig。dig 是 uber 开源的库。Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring。相比庞大的 Spring,dig 很小巧,实现和使用都比较简洁。 快速使用 第三方库需要先安装,由于我们的示例中使用了前面介绍的go-ini和go-flags,这两个库也需要安装: $ go g

Android 项目依赖

先上个简单的压压惊: 导入三方项目供自己使用: 由于Google重AndroidStudio  轻 Eclipse ,致使现在很多 开元的项目 都是AndroidStudio 版本了;那么如何把别人的项目导入到AndroidStudio 用于自己使用参考呢? 很简单:下载好别人的项目后 ;首先改下 配置信息; 作为配置参数的参考:首先大家应该有一个自己的在AndroidStudio 上

六、Maven依赖管理、依赖传递和依赖冲突

1.Maven依赖管理 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等问题。 我们通过定义 POM 文件,Maven 能够自动解析项目的依赖关系,并通过 Maven 仓库自动下载和管理依赖,从而避免了手动

Spring是如何解决循环依赖?

现象解释: 在Spring框架中,循环依赖(Circular Dependency)是指两个或多个Bean之间相互依赖,形成了一个循环。例如,Bean A依赖于Bean B,而Bean B又依赖于Bean A。Spring通过多种机制解决循环依赖问题,具体来说,主要有以下几种方式: 1.三级缓存机制 Spring容器在实例化Bean时使用了三级缓存来解决循环依赖,主要涉及三个缓存结构: 一级

数据依赖基础入门:函数依赖与数据库设计的关系

在数据库设计中,数据依赖 是一个重要的概念,它直接影响到数据库的结构和性能。函数依赖 作为数据依赖的一种,是规范化理论的基础,对数据库设计起着至关重要的作用。如果你是一名数据库设计的初学者,这篇文章将帮助你理解函数依赖及其在数据库设计中的应用。 什么是数据依赖? 数据依赖 是指同一关系中属性间的相互依赖和制约关系,它是数据库设计中语义的体现。在现实世界中,数据之间往往存在某种依赖关系,而这