Spark高频面试点经典总结

一、弹性分布式数据集(RDD)

  • 1、RDD介绍

简介:(存放数据的集合,数据是分布式存储的,可以保存在内存或磁盘中。是spark中最基本的数据抽象)

RDD(Resilient Distributed Dataset)弹性分布式数据集。
Resilient: 弹性的(可保存在内存或磁盘)
Distributed:数据是分布式存储的,便于分布式计算
Dataset: 一个集合,存放数据的

  • 2、RDD五大属性

    (1)分区列表 【存数据集的,当前rdd的上一个】

    (2)作用分区中的函数

    (3)RDD之前的依赖关系 :每次一个rdd通过函数操作会生成新的rdd 【spark容错机制的依据:会根据依赖关系进行数据恢复】

    (4)分区函数 * 只有k-v类型的RDD 才有分区函数(必须产生shuffle) (2种: Range和Hash)
    * 决定了数据的来源和数据处理后的去向

    (5)一个列表,存储每个Partition的最优位置
    【数据本地性和数据最优 ,优先分配给有数据的节点上 进行计算】 —— ——移动数据 不如 移动计算

  • 3、为什么会产生RDD

     解决了mapReduce 不能 循环式的数据流模型。可以把RDD的结果数据进行缓存,方便多次重用 可迭代计算,避免重复计算。提示IO操作。
    
  • 4、RDD在Spark中的作用和地位

     RDD是Spark中的底层核心,Spark是这个抽象方法的实现。 迭代运算 和 交互式
    
  • 5、创建RDD(3种)

     (1)通过sparkContext调用parallelize方法,需要一个已经存在的Scala集合创建
                 val rdd1 = sc.parallelize(集合/数组)
     (2)由外部存储系统的文件创建
                 val rdd2=sc.textFile("xxx")
     (3)已有的RDD经过算子转换生成新的RDD
                 val rdd3=rdd2.flatMap(_.split(" "))
    
  • 6、RDD算子

    • 算子分类(2类)
      • Transformation(转换): 一个rdd转换成新的rdd;所有转换都是延迟加载,是懒加载,只记录转换,只有遇到Action再执行。

      • Action (动作): 它会触发整个任务真正运行

      • Transformation 常见算子:
        map、filter、flatMap、mapPartitions(这四个面试常问到)、mapPartitionsWithIndex、union(并集)、intersection(交集)、distinct(去重)、groupByKey、reduceByKey(聚合)、sortBy、sortByKey、join(相同key提取,v依次排在后面)、cogroup、coalesce、repartition、repartitionAndSortWithKey
        mapParitions和map的区别 :一个只作用于分区,一个作用于每个元素 ???

      • Action 常见算子:
        reduce、collect、count、first、take、takeOrdered、saveAsTextFile、saveAsObjectFile、countByKey、foreach、foreachPartition

** RDD常用算子操作
1)map、filter
2)flatMap
3)交集、并集
4)join、groupByKey 区别
5)cogroup 与groupByKey区别
6)reduce 聚合
7)reduceByKey、sortByKey
8)repartition、coalesce (分区)repartition 改变分区数后,最开始的rdd1 分区后不会改变的。而是生成一个新的rdd1的分区数。
区别:前者可以添加或者减少分区数。后者只能减少,不能增加。
9)查看分区数 调用 .partitions.size

  • 7、RDD的依赖关系(宽、窄依赖;血统)

    • RDD的依赖 —— 我这里写的不太准确
      窄依赖 —— 每一个父RDD的Partition最多被子RDD的一个Partition使用 【独生子】
      宽依赖 —— 多个子RDD的Partition会依赖同一个父RDD的Partition 【超生】

    • Lineage(血统)
      记录RDD的元数据信息和转换行为。如果当前RDD的某些分区数据丢失后,可以通过血统来恢复丢失的分区。血统应该存在Application里面

  • 8、RDD的缓存

    • 把rdd1的数据进行缓存,以便之后对其能快速读取。

    • RDD的缓存方式

      • persist方法: 可以设置丰富的存储级别。 如:设置 序列化、内存、磁盘、几份 等

      • cache方法: 默认保存在内存中,本质调用的是persist的默认方法 即保存在内存中。

      • 对需要进行缓存的RDD调用persist和cache,不会立即执行,而是 有action算子时候才真正执行缓存操作。

      • spark有自带的机制,如果数据量太小,没有强制设置缓存在内存 而是 正常设置缓存在磁盘 但是依然会存在内存的。

  • 9、DAG(有向无环图)

简介:原始的RDD通过一系列的转换就形成了DAG

为什么要划分Stage:就是让每一个Stage中的多任务可以并行的运行,互不干扰,划分给对应的task执行。

划分Stage流程:
1、从最后一个rdd开始往前推,首先把当前rdd加入到一个stage中,这个stage就是最后一个stage
2、如果遇到窄依赖,就把当前rdd加入本stage中,如果遇到宽依赖,就从宽依赖切开,这样最后一个stage就已经结束了。
3、从切开的地方 重复执行1、2 规则, 继续往前推,依次推到最前面的rdd。
* 宽依赖是划分Stage的依据

*  每一个stage里面包含一组task,这些task都保存在taskSet集合里面,这些task是可以并行计算的。 
    stage与stage之间存在依赖关系,后面的要等它前面的都完成后才可以开始计算。   
  • 10、Spark任务调度

    流程图
    DAGScheduler
    TaskScheduler

二、checkpoint(检查点) (RDD容错机制之一)

* checkpoint 介绍: 为了更可靠的持久化数据,可以放在hdfs目录里,借用了hdfs的高容错、高可靠。

*  checkpoint与persist、cache的区别:
        *  persist和cache对数据持久化后,之前的血统没有改变,如果数据丢失,是通过血统重新得到。
        *  checkpoint在持久化后,依赖关系会改变(就不能再通过血统得到了)。如果持久化的数据丢了,不能重新计算恢复得到,只能再重新提交了。但是可能会浪费资源,因为新开了一个job。
        *  persist只能在当前Linux下缓存,checkpoint是可以放hdfs上。
*  数据丢失恢复顺序:    优先找cache;没有再找checkpoint;还没有再 重新计算 (从前面的rdd开始重新算)。

checkpoint 的使用和原理
* 1.sparkContext.setCheckpointDir(“hdfs上目录”)
* 2.针对于需要缓存的rdd数据调用
* rdd.checkpoint
* 调用算法后不是立马序列化而是触发action算子才执行
* 3、在运行的时候首先会先执行action这样一个job,执行完成之后,会单独开启一个新的job来执行checkpoint

            在RDD所处的job运行结束后,会启动一个单独的job来将checkpoint过的数据写入之前设置的文件系统持久化,进行高可用。

三、Spark运行架构

*  Spark运行基本流程:

各个RDD之间存在着依赖关系,这些依赖关系就形成有向无环图DAG;DAGScheduler对这些依赖关系形成的DAG进行Stage划分,划分的规则很简单,从后往前回溯,遇到窄依赖加入本stage,遇见宽依赖进行Stage切分。完成了Stage的划分;DAGScheduler基于每个Stage生成TaskSet,并将TaskSet提交给TaskScheduler;TaskScheduler负责具体的task调度(推测机制、本地性等),最后在Worker节点上启动task。
在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值