一:spark的组件构成

      

Spark 各组件功能 spark的组件_持久化

     1:每一个application有自己的executor的进程,它们相互隔离,每个executor中可以有多个task线程。这样可以很好的隔离各个applications,各个spark applications 不能分享数据,除非把数据写到外部系统。

SparkContext对象可以视为Spark应用程序的入口,主程序被称为driver program,SparkContext可以与不同种类的集群资源管理器(Cluster Manager),例如Hadoop Yarn、Mesos等 进行通信,从而分配到程序运行所需的资源,获取到集群运行所需的资源后,SparkContext将得到集群中其它工作节点(Worker Node) 上对应的Executors (不同的Spark应用程序有不同的Executor,它们之间也是独立的进程,Executor为应用程序提供分布式计算及数据存储功能),之后SparkContext将应用程序代码分发到各Executors,最后将任务(Task)分配给executors执行。

 二:spark相关概念

       Application                      运行在集群上的用户程序,包含集群上的driver program 和多个executor线程组成;

Driver program               application运行的main方法,并生成sparkcontext;

Cluster manager             集群资源管理器 ;

          Deploy mode                   部署模式 用于区别driver program的运行方式:集群模式(cluter mode),driver在集群内部启动;客户端模式(client mode),driver进程从集群外部启动;   

Worker node                    工作节点,运行application的节点

Executor                           work node的上进程,运行task并保持数据交互,每一个application有自己的executor

Task                                   运行于Executor中的任务单元,Spark应用程序最终被划分为经过优化后的多个任务的集合

由多个转变构建的并行计算任务,具体为Spark中的action操作,

  三:Resilient Distributed Datasets (RDDs)         


      resilient distributed datasetparallelizing 方法:序列化存在driver program 中的集合,见下方代码


val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)


val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data,10)


         

     RDD 可以抽象的认为是一个数组,这个数组分布在集群上,RDD可以进行逻辑上的分区,每个分区叫一个partition。在spark application运行过程中,RDD经过一个个transformtion 转换算子后,最后通过Action算计触发操作;RDD是懒加载的,前面的转化并不发生实际的操作,这个转化为记录在DAG图中,只有触发action后,才实际就行操作。逻辑上每经历一个变化,RDD就会转化为新的RDD,rdd之间通过lineage关系,这个关系在容错中起到至关重要的作用。

RDD的源码中标注了5个性质:

  1. 一组分片(partition),即数据集的基本组成单位
  2. 每个分片都可以计算
  3. 对parent RDD的依赖,这个依赖描述了RDD之间的lineage
  4. 对于key-value的RDD,一个Partitioner
  5. 一个列表,存储存取每个partition的preferred位置。对于一个HDFS文件来说,存储每个partition所在的块的位置。



     四:RDD的依赖


          RDD在每次转化时候,会生成一个新的RDD,但新的RDD和旧的RDD之间保持着关系,就是依赖,依据依赖的样式,可以划分为窄依赖和宽依赖;


      

Spark 各组件功能 spark的组件_持久化_02


    

       窄依赖是指每个父RDD的Partition最多被子RDD的一个Partition所使用,例如map、filter,见上左图



       宽依赖是指一个父RDD的Partition会被多个子RDD的Partition所使用,例如groupByKey、reduceByKey等



       



   五:RDD的持久化



Spark的 缓 存是一个容 错 的技 术 -如果RDD的任何一个分区 丢 失,它 可以通 过 原有的 转换 ( transformations )操作自 动 的重复 计 算并且 创 建出 这 个分区。另外,每一个RDD可以选择不同的持久化级别:



     MEMORY_ONLY     把RDD非序列化为Java对象存在jvm中,如果RDD不适合持久化在内存中,RDD的一些分区可能不能持久化,让此RDD需要的时候,此丢失的RDD分区会重新计算获取;



     MEMORY_AND_DISK   将RDD作为非序列化的Java对象存储在jvm中。如何RDD不适合存在内存中,将这些不适合存在内存的分区存在磁盘中



MEMORY_ONLY_SER把RDD序列化为Java对象存在jvm中,如果RDD不适合持久化在内存中,RDD的一些分区可能不能持久化,让此RDD需要的时候,此丢失的RDD分区会重新计算获取;



     DISK_ONLY  仅仅存在磁盘中



Spark也会自动持久化一些shuffle操作(如 reduceByKey )中的中间数据,即使用户没有调用 persist 方法。 这样 的好 处 是避免了在shuffle出 错 情况下,需要重复 计 算整个 输 入