Spark入门篇——RDD的血缘

2023-10-10 18:10
文章标签 spark rdd 入门篇 血缘

本文主要是介绍Spark入门篇——RDD的血缘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

RDD的血缘

概述

划分依赖的背景

划分以来的依据

窄依赖

宽依赖

 join的依赖

宽依赖

 窄依赖

 依赖与Stage的划分

Stage的类别

 依赖与容错

转换算子中间发生失败

DAG的生成

总结


RDD的血缘

概述

RDD可以从本地集合并行化、从外部文件系统、其他RDD转化得到,能从其他RDD通过Transformation创建新的RDD的原因是RDD之间有依赖关系(Dependency代表了RDD之间的依赖关系,即血缘(Lineage)),RDD和他依赖的父RDD有两种不同的类型,即宽依赖(wide dependency)和窄依赖(narrow dependency)。

划分依赖的背景

  1. 从计算过程,窄依赖是数据以管道的方式经一系列计算操作可以运行在一个集群节点上,,例如:map、filter。宽依赖则可能需要将数据跨节点传输后运行(如groupByKey),有点类似于MR的shuffle过程。
  2. 从失败恢复来看,窄依赖恢复起来更高效,因为他只需要找到父RDD的一个对应分区即可,而且可以在不同节点上并行计算做恢复。宽依赖则牵扯到父RDD的多个分区,恢复起来相对复杂一些。
  3. 在这里我们引入一个新的概念,Stage。Stage可以简单的理解为是由一组RDD组成的可进行优化的执行计划。若RDD的衍生关系为窄依赖,则可以放在同一个stage中运行。若RDD的依赖关系为宽依赖,则要划分到不同的Stage中。这样Spark在执行任务时,会按照Stage的划分,生成一个完整的最优的执行计划。

划分以来的依据

划分宽依赖和窄依赖的关键点在:分区的依赖关系

也就是说父RDD的一个分区的数据,是给子RDD的一个分区,还是给子RDD的所有分区。

父RDD的每一个分区,是被一个子RDD的一个分区依赖(一对一),就是窄依赖。

如果父RDD的每一个分区,是被子RDD的各个分区所依赖(一对多),就是宽依赖。

一旦有宽依赖发生,就意味着会发生数据的shuffle。发生了shuffle也就意味着生成了新的stage。

窄依赖

窄依赖是指父RDD的一个分区,被子RDD的一个分区所依赖(一对一)

输入输出一对一的算子,且结果RDD的分区结构不变,主要是map/flatMap/filter

输入输出一对一的算子但结果RDD的分区结构发生了变化,如union/coalesce

宽依赖

宽依赖指的是父RDD的一个分区,被子RDD的所有个分区依赖(一对多)。 

对单个RDD基于key进行重组和归并,如groupByKey,reduceByKey等。

对于两个RDD基于key进行join和重组。如join(父RDD不是hash-Partitioned)

需要进行分区,如partitionBy

 join的依赖

宽依赖

 窄依赖

 依赖与Stage的划分

Spark将窄依赖划分到同一个Stage中,因为他们可以进行流水线计算。而宽依赖往往意味着shuffle操作,这也是Spark划分stage的主要边界。一个Stage的开始就是从外部存储或者shuffle结果中读取数据;一个Stage的结束就是发生shuffle或者生成结果时。只要发生了shuffle,就会有Stage的划分。

Stage的类别

一个Job是由action算子触发的,一个Job中包含一个或者多个Stage,其中分为ResultStage(一个)和ShuffleStage(多个)。

 依赖与容错

宽、窄依赖的概念不知用于在stage的划分,对容错特很有用,RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。

dependency代表了RDD之间的依赖关系,即血缘(Lineage)。

数据进行切片后,每个分区对应的数据,是固定的。(其实偏移量和结束的偏移量)

分区是在driver端生成的,即使某一个分区挂掉了也没关系,driver端会根据rdd的依赖关系,重启新的task进行任务执行。

转换算子中间发生失败

  1. 运算是窄依赖:只要把丢失的父RDD分区重新计算即可,跟其他节点没有依赖,这样可以大大减少恢复丢失的数据分区的开销。
  2. 运算是宽依赖:需要父RDD的所有分区都存在,重算代价较高。
  3. 如果整个节点挂掉,driver会把任务在其他的节点中的executor中重启。
  4. 缓存或者增加检查点:当Lineage特别长或者有宽依赖的时候,主动调用checkpoint把当前数据写入稳定存储,作为检查点。但checkpoint会产生磁盘开销。因为做checkpoint时需要重新计算该RDD的内容,所以该RDD最好已经在内存中缓存了

为了提高运算的效率,更好的解决容错问题,spark提供了一系列的解决方案,缓存,检查点(checkpoint)

缓存:把rdd的数据,写入到内存或者磁盘

checkpoint: 写入到hdfs中

使用缓存和持久化来提升运行效率

DAG的生成

DAG叫做有向无环图,指任意一条边有方向,且不存在环路的图。其中点代表RDD,边代表RDD之间的依赖关系。

在Spark中每一个操作生成一个RDD,RDD之间连一条边,最后这些RDD和它们之间的边组成一个有向无环图,这个就是Spark的DAG图。原始RDD通过一系列的转换就形成了DAG,根据RDD之间的依赖关系的不同将DAG划分为不同的Stage,对于窄依赖,分区的转换处理在Stage中完成计算。对于宽依赖,由于shuffle的存在,只能在parentRDD处理完成之后,才能开始接下来的计算,因此宽依赖是划分Stage的依据

总结

DAG是有向无环图,代表着RDD的转换过程,其实就是代表着数据的流向。

DAG是有边界的,有开始,有结束。通过sparkContext创建RDD就是开始,触发action就会生成一个完整的DAG。DAG会被切分为多个Stage(阶段),切分的依据就是宽依赖(Shuffle),会先提交前面的stage,然后提交后面的stage,一个stage中根据最后一个RDD的分区出划分出多个Task,多个Task可以并行执行。

 

这篇关于Spark入门篇——RDD的血缘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

Spring Boot 入门篇

一、简介 Spring Boot是一款开源的Java Web应用框架,旨在简化Spring应用的初始搭建以及开发过程。它整合了Spring技术栈中的诸多关键组件,为开发者提供了一种快速、简便的Spring应用开发方式。Spring Boot遵循“约定优于配置”的原则,通过自动配置、起步依赖和内置的Servlet容器,极大地简化了传统Spring应用的配置和部署过程。 二、Spring Boot

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

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

(入门篇)JavaScript 网页设计案例浅析-简单的交互式图片轮播

网页设计已经成为了每个前端开发者的必备技能,而 JavaScript 作为前端三大基础之一,更是为网页赋予了互动性和动态效果。本篇文章将通过一个简单的 JavaScript 案例,带你了解网页设计中的一些常见技巧和技术原理。今天就说一说一个常见的图片轮播效果。相信大家在各类电商网站、个人博客或者展示页面中,都看到过这种轮播图。它的核心功能是展示多张图片,并且用户可以通过点击按钮,左右切换图片。

第49课 Scratch入门篇:骇客任务背景特效

骇客任务背景特效 故事背景:   骇客帝国特色背景在黑色中慢慢滚动着! 程序原理:  1 、 角色的设计技巧  2 、克隆体的应用及特效的使用 开始编程   1、使用 黑色的背景: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d74c872f06b4d9fbc88aecee634b074.png#pic_center)   2

【轻松上手postman】入门篇:如果根据接口文档写postman接口用例

在我们平时的测试工作中除了最基本的网页测试外,也会遇到没有页面但需要验证内部逻辑正确性的接口测试任务,在遇到没有网页的测试任务时,我们就要使用到接口测试工具来模拟对程序代码触发。 在接到接口测试任务时,一般都会拿到接口需求文档,没接触过接口测试的人看到接口文档正常反应一脸闷🤣不知如何下手怎么开始测试😓,下面我就来讲讲如何将接口文档上的一个个接口转换成postman用例 首先需要安装

入门篇:神奇的Annotation

涅槃1992 关注 2016.12.25 23:41* 字数 4964 阅读 1059评论 3喜欢 29 前面写了Android 开发:由模块化到组件化(一),很多小伙伴来问怎么没有Demo啊?之所以没有立刻放demo的原因在还有许多技术点没说完. 今天我们就来细细评味Java当中Annotation,也就是我们常说的注解. 本文按照以下顺序进行:元数据->元注解->运行时注解->编译时

RDD的map和flatMap

在 Apache Spark 中,map 和 flatMap 是 RDD(弹性分布式数据集)中最常用的转换操作之一。 map 假设你有一个包含整数的 RDD,你想要计算每个元素的平方。 from pyspark import SparkContextsc = SparkContext(appName="MapExample")# 创建一个包含整数的 RDDnumbers = sc.para

springboot+dubbo+zk 入门篇(windows单机版)

一、下载安装zk注册中心并启动:     官网地址:http://www.apache.org/dyn/closer.cgi/zookeeper/     我的是zookeeper-3.3.6版本的。下载之后需要修改下文件:进入zk的conf目录。复制下zoo_sample.cfg     这个文件并重命名为zoo.cfg,然后把修改该文件内容,下面是我的,这个只是单机配置: # 心跳时间间隔

【spark 读写数据】数据源的读写操作

通用的 Load/Save 函数 在最简单的方式下,默认的数据源(parquet 除非另外配置通过spark.sql.sources.default)将会用于所有的操作。 Parquet 是一个列式存储格式的文件,被许多其他数据处理系统所支持。Spark SQL 支持对 Parquet 文件的读写还可以自动的保存源数据的模式 val usersDF = spark.read.load("e