SPARK简述(二)

RDD弹性分布式数据集,是只读的分区记录集合;Spark最核心最精髓的部分,spark将所有数据都抽象成RDDRDD是一个能够让用户可以准确的将中间结果数据持久化到内存中的一个可容错的并行数据结构,可以控制(RDD数据集) 分区,优化数据存储,并且有一组丰富的操作集可以操作这份数据。

RDD的获取:从共享的文件系统获取(如:HDFS);通过已存在的RDD转换。

RDD操作:作用RDD上的Operation分为转换(transformantion)和动作(action)Spark中的所有“转换”都是惰性的,在执行“转换”操作时,并不会提交Job,只有在执行“动作”操作,所有operation才会被提交到cluster中真正的被执行。这样可以大大提升系统的性能RDD拥有的操作比MR丰富的多,不仅仅包括MapReduce操作,还包括filtersortjoin操作,所以SparkMR更容易方便完成更复杂的任务。

RDD5个主要属性:

一组分片(Partition):数据集的最基本组成单位,用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPU Core的数目。每个分配的存储是由BlockManager实现的,每个分区都会被逻辑映射成BlockManager的一个Block,而这个Block会被一个Task负责计算。

一个计算每个分片的函数Spark中的RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的;compute函数会对迭代器进行复合,不需要保存每次计算的结果。

依赖(Dependencies):RDD的依赖关系,描述了RDD之间的lineage,可分为宽依赖和窄依赖。

preferredLocations(可选):对于存储data partition的位置偏好,按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。

partitioner(可选RDD的分片函数,用于对计算出来的数据结果如何分发。当前Spark中实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另外一个基于范围的RangePartitioner。只有对于key-valueRDD,才会有Partitioner,非key-valueRDDPartitioner的值是None

RDD持久化

默认情况下,每一个转换过的RDD都会在它之上执行一个动作时被重新计算。如果rdd只被使用一次或者很少次,不需要持久化。如果rdd被重复使用或者计算其代价很高,才考虑持久化。另外,shuffle后生成的rdd尽量持久化,因为shuffle代价太高。

使用 persist方法(或者cache方法),持久化一个RDD在内存或磁盘中。或者使用cache(),它是将RDD persist在内存里,persist()操作可以为RDD指定StorageLevel

RDD被缓存后,Spark将会在集群中,保存相关元数据,下次查询这个RDD时,它将能更快速访问,不需要计算。如果持久化无谓的RDD,会浪费内存(或硬盘)空间,反而降低系统整体性能。

RDD容错机制

窄依赖间,发生计算失败:只要把丢失的父RDD分区重算即可,跟其他节点没有依赖而且不同节点之间可以并行计算,这样可以大大加快场景恢复的开销。

宽依赖间,发生计算失败:单个节点失效可能导致这个RDD的所有祖先丢失部分分区,因而需要整体重新计算RDD的所有分区,重算代价就较高。 

增加检查点:当Lineage(血缘链)特别长时或者有宽依赖时,主动调用 checkpoint把当前数据写入稳定存储,作为检查点

将DAG划分为Stage核心算法

ApplicationjobStageSpark Application中可以因为不同的Action触发众多的job,一个Application中可以有很多的job,每个job是由一个或者多个Stage构成的,后面的Stage依赖于前面的Stage,也就是说只有前面依赖的Stage计算完毕后,后面的Stage才会运行。

划分依据Stage划分的依据就是宽依赖reduceByKey , groupByKey等算子,会导致宽依赖的产生。

核心算法从后往前回溯,遇到窄依赖加入本stage,遇见宽依赖进行Stage切分。Spark内核会从触发Action操作的那个RDD开始从后往前推,首先会为最后一个RDD创建一个stage,然后继续倒推,如果发现对某个RDD是宽依赖,那么就会将宽依赖的那个RDD创建一个新的stage,那个RDD就是新的stage的最后一个RDD。然后依次类推,继续继续倒推,根据窄依赖或者宽依赖进行stage的划分,直到所有的RDD全部遍历完成为止。

Spark运行模式——Standalone为例

1SparkContext连接到Master,向Master注册并申请资源(CPU Core Memory

2Master根据SparkContext的资源申请要求和Worker心跳周期内报告的信息决定在哪个Worker上分配资源,然后在该Worker上  获取资源,然后启动StandaloneExecutorBackend

3StandaloneExecutorBackendSparkContext注册;

4SparkContextApplicaiton代码发送给StandaloneExecutorBackend;并且SparkContext解析Applicaiton代码,构建DAG图,并提交给DAG Scheduler分解成Stage ,然后Stage(或者称为TaskSet)提交给Task SchedulerTask Scheduler负责将Task分配到相应的Worker,最后提交给StandaloneExecutorBackend执行;

5StandaloneExecutorBackend会建立Executor线程池,开始执行Task,并向SparkContext报告,直至Task完成

6、所有Task完成后,SparkContextMaster注销,释放资源

Spark运行模式——Standalone为例

Spark运行模式——Standalone为例

Spark运行模式——Standalone为例SpSpark运行模式——Standalone为例Spark运行模式——Standalone为例ark运行模式——Standapark运行模式——St

猜你喜欢

转载自blog.csdn.net/qq_15349687/article/details/82747587