spark入门之一 spark组件

来源:互联网 发布:电脑拍摄软件 编辑:程序博客网 时间:2024/05/16 09:05

一:spark的组件构成

      

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

      2: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应用程序最终被划分为经过优化后的多个任务的集合

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

  三:Resilient Distributed Datasets (RDDs)         

          spark 涉及的核心概念就是resilient distributed dataset (RDD),rdd是具有容错性的数据集合,并可以并行数据计算。有两种方法可以创建rdd,第一种就是parallelizing 方法:序列化存在driver program 中的集合,见下方代码
val data = Array(1, 2, 3, 4, 5)val distData = sc.parallelize(data)
parallelize 方法中可以指定数据分区参数,并每个分区对应一个task 如下面代码
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之间保持着关系,就是依赖,依据依赖的样式,可以划分为窄依赖和宽依赖;
      
    
       窄依赖是指每个父RDD的Partition最多被子RDD的一个Partition所使用,例如map、filter,见上左图
       宽依赖是指一个父RDD的Partition会被多个子RDD的Partition所使用,例如groupByKey、reduceByKey等
       
   五:RDD的持久化
          RDD的持久化是spark的一个重要的特性,当你把RDD持久化,每个Node会存储RDD的分区在内存,在其他action中用到此rdd的时候,就不用从头转化,而是直接使用。你可以用persist或者cache方法持久化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出 错 情况下,需要重复 计 算整个 输 入

     

             


          

0 0