spark知识点总结(1)

1.RDD弹性分布式数据集:是抽象出来的概念,元素的集合。是一批节点上一批数据的集合。

分布式:每个rdd会把数据分成多个parttioner放在多个节点上。eg:90万条数据放在9个节点上面,每个   节点9万条数据。

弹性:eg:每个节点上面个的内存中只能存放5万条数据,那么他会把剩下的4万条存放在磁盘当中。

RDD提供个高容错性的机制,当一个RDD上面的数据发生丢失,他会自动的从上一个RDD中去回复数据。

RDD会从hdfs/hive上面读取数据,然后存放在不同的节点上面。然后进行迭代式的运算。spark和mapreduce的最大区别就是,maprdeuce只经历了两个阶段,而spark经历了N个阶段,对数据经行处理。

spark最终会把数据保存在,1,hdfs/hive上。2,mysql/hbase。3,返回到客户端

spark框架:1.离线批处理。2,sql查询。3,实施计算。

2.sparkcontext 是spark程序的入口,根据输入文件的类型读取文件,读取本地文件textFile
Java    flatmap算子是把RDD一个元素拆成一个或多个多元素
        maptopari 算子是将每一个元素映射成为(v1,v2)的tuple类型
        reduceByKey算子是对tule中的第二个值进行累加,在java中没有reduceBy这个算子
        
3.spark工作原理
   dirver:提交spqrk程序的节点,包含sparkcontext负责程序与spark集群进行交互,申请资源,创建RDD等。
   
   master:进程,负责资源的调度和分配,集群的监控等等。
   worker:进程,两个职责,一是用自己的内存,存储RDD的某个或某些PARTITION;另外,启动其他进程和线程,对RDD的partition进行并行的计算和处理。
  
   execurtor和task:负责执行,对RDD的partition进行并行的计算,比如:map,flatmap等等。
   
4.创建RDD
   1.并行化集合创建RDD:在实际用途中是为了本地测试
   2.用本地文件创建RDD:处理大文件的时候用到
   3.hdfs方式创建RDD:用于生产环境,离线批处理操作,hive   
   
5.spark的共享变量BroadCast,与累加变量
    1.BroadCast是只读的,并且在每个节点上只会有一个副本,最主要是减少变量到各个节点的            网络传输消耗,以及各个节点的内存传输消耗。用它里里面的value方法会拿到里面的每一个值
    2.Accumulator累加变量,每个task只能对其进行累加,不能读。只有dirver才有只读的权限。用+=的方式给它赋值。
6.持久化RDD
    为什么:action算子在触发的时候会重复的读取linrRDD中的值,效率低下。浪费资源,浪费时间。
    
    
    注意:spark在进行shuffle时也会进行持久化操作,防止数据丢失时计算整个过程进行恢复。
    
7.DAGsc
    当提交一个job的时候就会触发DAG去执行,DAG执行的时候会调用taskSC,去执行excutor上面的task,其中DAG里面有一个非常重要的blockManger内存管理的组件
    
8.spark中的shuffle
    时spark性能调优的核心,有两个特点,1.buket的缓存问题。2.shuffleMapTask到resultTast数据拉取问题。
    在spark新版本中,引入了Consolidation机制,对shuffle进行了优化,开启了并行执行的ShuffleMapTask
    
9.checkpoint时spark中的一个重要的容错机制。当对一个RDD设置了checkpoint机制他就受RDDcheckpointData对象的管理,RDDCheckpoinData对象,会将对调用chaeckpoint方法RDD的状态设置为MarkedForCheckpoint。会调用job中,最后一个RDD的docheckpoin()方法,该方法会沿着finalRdd的lineAge机制向上查找,把设置为markedCheckpoint的RDD标记为CheckpointinglnProgress,启动单独的job来将linage中标记为CheckpointtingProgress的RDD,进行checkpoint操作,也就是将数据写入SparkContext.setCheckpointDir方法中。

    checkpoin与持久化的区别在于
    1,最主要就是持久化只是将数据保存在BlockManger中,但是RDD的lineage是不变的,但是执行完checkpoint以后RDD已经没有了lineage,而是为其强行设置了一个CheckPointRDD,就是说checkpoint之后lineage就发生了改变
    2.持久化的数据通常发生丢失的可能性很大,而checkpoint是保存在hdfs上很难发生丢失。
    
    3,默认情况下,如果某个RDD没有持久化,还设置了checkpoint,那是很危险的。本来job执行结束了,但是由于中间的RDD没有持久化,那么chenckpoint job想要将RDD的数据写入外部文件,还的从RDD之前所有的RDD全部重新计算一次,然后计算出rdd的数据再将其Checkpoint到外部文件系统。·
    
    
10.stage的划分机制:在最后一个rdd调用action算子以后DAGscheduler会调用runjob方法生成一个finalstage,然后往上找,如果有宽依赖,就会划分一个stage。DAGscheduler划分款依赖
    的时候有两个特别重要的方法submitstage和getMissingParentStages
    
11.job触发流程


12.spark中的分区
    用parallelize读取数据时如果不指定分区机会按默认的集群环境进行分区
    本地模式:按本地cpu的数目进行分区,设置了local[N]则默认为N
    apache mesos:默认的分区为8
    standlone或yarn,:默认是取集群中所有核心数目的总和,或者是2,取二者的较大值。对于parallelize来说,没有在方法中的指定分区数,则默认为spark.default.parallelism,对于textFile来说,没有在方法中的指定分区数,则默认为min(defaultParallelism,2)而defaultParallelism对应的就是spark.default.parallelism。如果是从hdfs上面读取文件,其分区数为文件分片数(128MB/片)
    
    
    
    1.分区
         分区是RDD内部并行计算的一个计算单元,RDD的数据集在逻辑上被划分为多个分片,每一个分片称为分区,分区的格式决定了并行计算的粒度,而每个分区的数值计算都是在一个任务中进行的,因此任务的个数,也是由RDD(准确来说是作业最后一个RDD)的分区数决定。

    2.分区的个数
         RDD分区的一个分区原则:尽可能是得分区的个数等于集群核心数目

        下面我们仅讨论Spark默认的分区个数,这里分别就parallelize和textFile具体分析其默认的分区数

        无论是本地模式、Standalone模式、YARN模式或Mesos模式,我们都可以通过spark.default.parallelism来配置其默认分区个数,若没有设置该值,则根据不同的集群环境确定该值

        本地模式:默认为本地机器的CPU数目,若设置了local[N],则默认为N
         Apache Mesos:默认的分区数为8
         Standalone或YARN:默认取集群中所有核心数目的总和,或者2,取二者的较大值
         结论:
         对于parallelize来说,没有在方法中的指定分区数,则默认为spark.default.parallelism
        对于textFile来说,没有在方法中的指定分区数,则默认为min(defaultParallelism,2),而defaultParallelism对应的就是spark.default.parallelism。如果是从hdfs上面读取文件,其分区数为文件分片数(128MB/片)
    
    
    
    
    
    
    
    
    
    
    
   

猜你喜欢

转载自blog.csdn.net/yxf527274600/article/details/83624038
今日推荐