热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SparkRDD宽窄依赖及Stage划分

1.术语解释:Master(Standalone):资源管理的主节点(进程)ClusterManager:在集群上获取资源的外部服务(例如standalone,Mesos,Yarn

1.术语解释:

Master(Standalone):资源管理的主节点(进程)

Cluster Manager:在集群上获取资源的外部服务(例如standalone,Mesos,Yarn)

Worker Node(standalone):资源管理的从节点(进程)或者说管理本机资源的进程

Application:基于Spark的用户程序,包含了Driver程序和运行在集群上的executor程序

Driver Program:用来连接工作进程(Worker)的程序

Executor:是在一个Worker进程所管理的节点上为某一个Application启动的一个进程,该进程负责运行任务,并且负责将数据存在内存或者磁盘上,每个应用各自独立的executors

Task:被送到某个executor上的工作单元

Job:包含很多任务(Task)的并行计算,可以看做和action对应

Stage:一个Job会被拆分成很多组任务,每组任务被称为Stage

按照资源层面划分:Master ->Worker->Executor->ThreadPool

按照任务层面划分:Application->job->stage->tasks

2.宽窄依赖:

RDD之间有一系列的依赖关系,依赖关系又分为窄依赖和宽依赖。

Spark中的Stage其实是一组并行的任务,任务是一个个的Task

窄依赖:

父RDD和子RDDpartition之间的关系是一对一的,或者父RDD一个partition只对应一个子RDD的partition情况下的父RDD和子RDD partition关系是多对一的,不会有shuffle产生。父RDD的一个分区去到了子RDD的一个分区

《Spark----RDD宽窄依赖及Stage划分》
《Spark----RDD宽窄依赖及Stage划分》

宽依赖:

父RDD与子RDD partition之间的关系是一对多,会有shuffle的产生。父RDD的一个分区的数据去到了子RDD的不同分区里面。

《Spark----RDD宽窄依赖及Stage划分》
《Spark----RDD宽窄依赖及Stage划分》

区分宽窄依赖主要就是看父RDD的一个partition的流向,要是流向一个的话就是窄依赖,流向多个的话就是宽依赖。相比于宽依赖,窄依赖对优化很有利,主要基于一下两点:

1.宽依赖往往对应着shuffle操作,需要在运行过程中将同一个父RDD的分区传入到不同的子RDD分区中,中间可能涉及多个节点间的数据传输,而窄依赖的每个父RDD分区只会传入到一个子RDD分区中,通常可以在一个节点内完成转换。

2.当RDD分区丢失时(某个节点故障),spark会对数据进行重算

1).对于窄依赖,由于父RDD的一个分区只对应一个子RDD分区,这样只需要重算和子RDD分区对应的父RDD分区即可,所以这个重算对数据的利用率是100%的。

2).对于宽依赖,重算的父RDD分区对应多个字RDD分区,这样实际上父RDD中只有一部分的数据是被用于恢复这个丢失的子RDD分区的,另一部分对应子RDD的其他未丢失分区,这就造成了多余的计算,宽依赖中子RDD分区通常来自于多个父RDD分区,极端情况下,所有的父RDD分区都要重新计算

3).如下图所示,b1分区丢失,则需要重新计算a1,a2和a3,这样就产生了冗余计算(a1,a2,a3中对应着b2的数据)

《Spark----RDD宽窄依赖及Stage划分》

区分这两种依赖很有用,首先,窄依赖允许在一个集群节点上以流水线的方式(pipeline)计算所有父分区。例如,逐个元素地执行map,然后filter操作;而宽依赖则需要首先计算好所有父分区数据,然后在节点间进行shuffle,这和MapReduce类似。第二,窄依赖能够更有效地进行失效节点的恢复,即只需要重新计算丢失RDD分区的父分区,而且不同节点间可以并行计算;而对于一个宽依赖关系的Lineage图,单个节点失效可能导致这个RDD的所有祖先丢失部分分区,因而需要整体重新计算。

在深入分区级别来看待这个问题,重算的效用并不在于算了多少,而是在于有多少是冗余的计算。窄依赖中需要重算的都是必须的,所以重算并不会产生冗余计算。

3.Stage划分:

Spark任务会根据RDD之间的依赖关系,形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把DAG划分成互相依赖的多个stage,划分stage的依据就是RDD之间的宽窄依赖。遇到宽依赖就划分stage,每个stage包含一个或多个task任务,然后将这些task以taskSet的形式提交给TaskScheduler运行。

stage是由一组并行的task组成。

stage切割规则:从后往前,遇到宽依赖就切割stage

《Spark----RDD宽窄依赖及Stage划分》
《Spark----RDD宽窄依赖及Stage划分》

stage计算模式:pipeline管道计算模式,pipeline只是一种计算思想,模式

《Spark----RDD宽窄依赖及Stage划分》
《Spark----RDD宽窄依赖及Stage划分》

备注:

1.Spark的pipeline的计算模式

相当于执行了一个高阶函数f4(f3(f2(f1(“…..))))。也就是来一条数据然后计算一条数据,把所有的逻辑走完,然后落地。准确的说,是一个task处理一串分区的数据。整个计算逻辑全部走完。而MapReduce是1+1=2,2+1=3的模式,也就是计算完落地,然后拉取,再执行计算,然后再落地到磁盘或者内存,最后数据是落在计算节点上,按reduce的hash分区落地。所以这也是Saprk比MapReduce快的原因,是完全基于内存计算的。

2.管道中的数据何时落地:

shuffle write的时候

对RDD进行持久化的时候

3.Stage的task并行度是由stage的最后一个RDD的分区数来决定的

一般来说,一个partition对应一个task,但最后reduce的时候,可以手动改变reduce的个数来提高并行度,也就是分区数。例如reduceByKey(xxx,3),GroupByKey(4),union的分区数,是由前面的相加

测试验证pipeline计算模式(迭代器模式):

import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} object pipeLineTest { def main(args: Array[String]): Unit = { val cOnf= new SparkConf().setMaster(“local”).setAppName(“pipelineTest”) val sc = new SparkContext(conf) sc.setLogLevel(“Error”) val rdd1 = sc.parallelize(Array(1,2,3,4)) val rdd2: RDD[Int] = rdd1.map { x => { println(“map———” + x) x } } val rdd3: RDD[Int] = rdd2.filter(x => { println(“filter***********” + x) true }) rdd3.collect() sc.stop() } }

运行结果如下所示:

《Spark----RDD宽窄依赖及Stage划分》
《Spark----RDD宽窄依赖及Stage划分》


推荐阅读
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文介绍了如何在Android应用中通过Intent调用其他应用的Activity,并提供了详细的代码示例和注意事项。 ... [详细]
  • 本文介绍了如何在Spring框架中使用AspectJ实现AOP编程,重点讲解了通过注解配置切面的方法,包括方法执行前和方法执行后的增强处理。阅读本文前,请确保已安装并配置好AspectJ。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 本文详细介绍了如何在Android应用中实现重复报警功能。示例代码可在以下路径找到:https://developer.android.com/samples/RepeatingAlarm/index.html。首先,我们将从Manifest文件开始分析。 ... [详细]
  • 本文详细介绍了 Spark 中的弹性分布式数据集(RDD)及其常见的操作方法,包括 union、intersection、cartesian、subtract、join、cogroup 等转换操作,以及 count、collect、reduce、take、foreach、first、saveAsTextFile 等行动操作。 ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • 本文详细介绍了在 Ubuntu 16.04 系统上安装和配置 PostgreSQL 数据库的方法,包括如何设置监听地址、启用密码加密、更改默认用户密码以及调整客户端访问控制。 ... [详细]
  • 深入理解云计算与大数据技术
    本文详细探讨了云计算与大数据技术的关键知识点,包括大数据处理平台、社会网络大数据、城市大数据、工业大数据、教育大数据、数据开放与共享的应用,以及搜索引擎与Web挖掘、推荐技术的研究及应用。文章还涵盖了云计算的基础概念、特点和服务类型分类。 ... [详细]
  • GreenPlum采纳ShareNothing的架构,良好的施展了便宜PC的作用。自此IO不在是DW(datawarehouse)的瓶颈,相同网络的压力会大很多。然而GreenPlum的查问优化策略可能防止尽量少的网络替换。对于首次接触GreenPlum的人来说,必定耳目一新。 ... [详细]
  • 本文介绍了一种通过设置主题(Theme)来实现快速启动的Android引导页,并详细说明了如何避免因不同屏幕分辨率导致的图片拉伸问题。 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • 本文介绍了如何将Spring属性占位符与Jersey的@Path和@ApplicationPath注解结合使用,以便在资源路径中动态解析属性值。 ... [详细]
author-avatar
mobiledu2502931077
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有