RDD运行原理

RDD产生的原因

        在之前的机器学习里以及交互式挖掘等经常会涉及很多迭代式计算,这些迭代计算会涉及到一个中间结果计算的重用问题,MapReduce是把中间结果写入到磁盘里面,下次要使用的时候再从磁盘里读取中间结果,这样就会带来大量化的磁盘读写开销以及序列化与反序列化的开销。这里说的序列化是指将内存中的java对象进行转换为存储或传输的格式,比如说可以将java对象序列化为二进制对象或ssm文本格式,方便在网络上存储或传输。而将二进制或ssm文本还原成java对象,则称为反序列化。RDD就是为了避免这些问题而产生的。

        RDD提供了抽象的数据结构,从而不用担心底层的分布式特性,而只需要经我们的逻辑表达为一个个转换处理(不论多复杂的逻辑都可以将其变为RDD转换),不同的转换关系就形成了rdd的转换的依赖关系,即为有向无环图DAG。

对于该依赖图我们可以进行优化处理,从而实现相应的管道处理,一个操作结束后,数据不需要进入磁盘,马上就可以进行下一个操作。

        一个RDD就是一个分布式集合,其本质为一个只读(不能修改)的分区记录集合,一个RDD可以存储几十G或多少个T的数据,一个单机存不下,我们可以将其分布式的保存在很多台机器上,将RDD分成若干个分区,每个分区放在不同的机器上去,每个分区就是一个数据片段,把它分布在不同结点上面,数据分布在不同结点上,从而就可以使计算分布式并行。这就是其为什么可以加快速度,因为数据被分布式存储了,所以计算就可以在多台计算上并行的发生。

        RDD提供了一种高度受限的共享内存模型,这里说的高度受限是因为RDD为只读,RDD一旦生成就不能对其发生变化。

RDD在转换当中是可以发生修改的,通过生成一个新的RDD来完成数据修改的目的。

RDD提供了两种类型的操作:动作类型操作(action)和转换类型操作(transformation),这两种操作都是粗粒度的转换操作,粗粒度转换意思是一次只能针对RDD全集进行转换(一个记录全集进行转换),而不支持对单挑进行修改。

虽然RDD为高度受限的内存模型,同时只能进行粗粒度转换,但是它却不影响功能操作。

Spark提供了RDD的的API,程序员可通过调用API实现对RDD的各种操作。

RDD的典型执行过程:

RDD的惰性机制,RDD的一系列转换操作并不会真正进行转换,其只记录的转换的意图,并不会真正发生计算,只有当遇到动作类型操作,它才会从头到尾执行计算。管道化是只每次转换过程中可以形成一个管道流,我们可直接将一个操作的输出呈给下一个操作,而不需要将中间结果进行存储处理。同时因为操作非常多,每一个操作就非常简单,将这些简单的操作串联起来就可以解决很多复杂的功能。

spark为什么能实现高效的计算呢?

第一,其有高效的容错性;

第二,中间结果持久化内存RDD.cache(),数据在内存的多个RDD之间进行传递操作,避免了不必要的磁盘读写开销

第三,避免了序列化及反序列化开销

 

RDD的依赖关系

        一个RDD应用会分成多个作业关系,一个作业关系会分成多个阶段(为什么一个作业会分成多个阶段?)以什么依据将一个作业拆分为多个阶段?这里就涉及到宽依赖和窄依赖的问题,它决定是否拆分阶段的依据。

        窄依赖不划分阶段,宽依赖划分成多个阶段。是否包含shuffle操作是区分宽依赖和窄依赖的依据。包含shuffle操作即为宽依赖,没有包含shuffle操作则称为窄依赖。

        

        像上图这样交叉洗牌的操作就称为shuffle操作。shuffle操作就是发生了很多来回数据交叉的分发。

宽依赖和窄依赖的区分

窄依赖特征:一个父RDD分区对应一个子RDD的分区或者多个父RDD分区对应一个子RDD的分区。

      

宽依赖特征:一个父RDD的一个分区对应多个子RDD的多个分区(即一个父亲对应多个儿子)

                    

 

为什么宽依赖需要在shuffle操作处划分成多个阶段,而窄依赖就不要划分呢?

这是因为窄依赖可以进行流水线优化的,而宽依赖不能进行流水线优化。

 

spark优化机制

spark采用了fork/join机制,这是分布式典型的优化机制。

此处为RDD1转换为RDD2,但是在一个复杂的RDD应用中,可能会不断地转换。

一个单个的转换就是一次fork/join,多个不同转换串联起来就说多个不同的fork/join。每次RDD操作都是一次fork/join,多个RDD串联起来就是多个fork/join的组合。

多个fork/join组合怎么能够优化呢?

只要发生shuffle就会一定会写入磁盘。优化就是让数据中间不要落入磁盘中,直接在内存中就完成一个操作的输出到下一个操作的输入。一旦发生shuffle操作,一定是发生数据的交换(洗牌),这时候就需要写入磁盘,进行操作。

在该图中我们可以省去上海的join,从而达到优化的目的,最后飞行时长为5小时。

上图中因为上海到厦门的人员分配有变动,即shuffle,不能取消上海的join,因此不能进行优化。

 

RDD运行过程

         RDD的运行过程:首先提交所写的rdd代码给spark框架,spark框架会根据提供的代码生成一个有向无环图,即DAG图,DAG图会提交给DAGScheduler,DAGScheduler会将其分成多个阶段,每个阶段包含若干个任务,每个任务会被分配给TaskScheduler,TaskScheduler会把任务分配给工作节点上的Excutor进程,然后由Excutor进程派发出来的线程去执行任务,这样就完成了一个工作,即为RDD的整个执行过程。 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark内部运行原理是,它通过一系列的步骤来处理数据,包括读取数据、转换数据、运行计算任务和存储结果。它使用一个叫做RDD(可分配数据集)的抽象来表示数据,这样可以更容易地处理数据。它还使用一个叫做Spark Core的库来处理数据,这个库可以分发任务到多个节点,并且可以让多个节点协同工作来处理数据。 ### 回答2: Spark是一个快速、通用的大数据处理引擎,它采用了分布式计算的方式来处理大规模数据集。Spark的内部运行原理可以简单概括为以下几个关键点: 1. 弹性分布式数据集(RDD):Spark的核心概念是弹性分布式数据集(RDD),它是一个可分区、可并行处理的数据集合。Spark将数据分成多个RDD,可以在集群的多个节点上自动并行处理。 2. DAG调度:Spark将用户的操作转化为有向无环图(DAG),以表示计算过程中的依赖关系。Spark通过DAG调度,将整个计算流程划分为多个阶段(Stage),以实现任务的并行处理和调度。 3. 分布式数据处理:Spark可以将数据集合分成多个分区,并将每个分区的计算任务分发到不同的节点上并行执行。通过分区级别的并行处理,Spark能够高效地处理大规模数据集,并实现性能上的显著提升。 4. 内存计算:Spark将数据存储在内存中,以避免频繁的磁盘读写操作。通过充分利用内存计算能力,Spark能够在处理数据时提供更高的计算速度和性能。 5. 数据流水线:Spark将数据处理过程划分为多个阶段,并通过内存中的缓存和数据流水线技术,减少中间结果的计算和存储开销。这种方式能够提高计算效率,并减少数据处理的延迟。 总之,Spark的内部运行原理包括了RDD的分布式计算模型、DAG调度、分区级别的并行处理、内存计算和数据流水线等关键技术。通过这些技术的有机结合,Spark能够高效地处理大规模数据集,并提供快速的数据分析和处理能力。 ### 回答3: Spark内部运行原理主要包括以下几个方面。 首先,Spark运行的核心是Resilient Distributed Dataset(RDD),它是一个可容错、可并行处理的数据集合。RDD可以通过数据源创建,或者通过对已有RDD的转换操作得到。RDD的分区决定了数据的并行度,每个分区都存储着数据的一个子集。 其次,Spark运行时采用了分布式的集群架构。集群由一个主节点(即Driver)和多个从节点(即Executors)组成。主节点负责任务的调度和分发,从节点负责具体的任务执行。主节点将任务分成多个Stage,每个Stage包含一系列的任务,并通过DAG表示Stage之间的依赖关系。 然后,Spark通过一种称为Transformations的操作来对RDD进行转换。Transformations分为窄依赖和宽依赖。窄依赖意味着每个父RDD的分区仅有一个子RDD的分区依赖,这可以使得数据传输更快。而宽依赖意味着每个父RDD的分区可能有多个子RDD的分区依赖,这会引入shuffle操作来重新分区,增加了计算和数据传输的开销。 最后,Spark的计算模型是基于弹性分布式数据集的。Spark将计算过程划分为一系列的Stage,并将每个Stage划分为多个Task。Task在Executor上并行执行,每个Task会处理一个或多个RDD的分区。计算结果会被缓存在内存中,可以被后续的计算使用,从而提高了计算效率。 综上所述,Spark内部运行原理主要包括RDD、集群架构、Transformations、计算模型等方面。通过这些机制,Spark实现了高效的分布式计算和数据处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值