Spark面试题(持续更新)

1.RDD中reduceBykey与groupByKey哪个性能好,为什么?

reduceByKey:reduceByKey会在结果发送至reducer之前会对每个mapper在本地进行merge,有点类似于在MapReduce中的combiner。这样做的好处在于,在map端进行一次reduce之后,数据量会大幅度减小,从而减小传输,保证reduce端能够更快的进行结果计算。
groupByKey:groupByKey会对每一个RDD中的value值进行聚合形成一个序列(Iterator),此操作发生在reduce端,所以势必会将所有的数据通过网络进行传输,造成不必要的浪费。同时如果数据量十分大,可能还会造成OutOfMemoryError。
通过以上对比可以发现在进行大量数据的reduce操作时候建议使用reduceByKey。不仅可以提高速度,还是可以防止使用groupByKey造成的内存溢出问题。

2.Spark与MapReduce的区别

  1. 针对迭代的业务场景,Spark可以基于内存计算,MR是基于磁盘
    spark与Hadoop MR不同的是,任务的中间结果可以保存到内存中,大大地提高了计算性能.
  2. Spark中有DAG有向无环图切分任务的执行先后顺序
  3. Spark存储数据可以指定副本个数(持久化存储),MR默认3份。
  4. MapReduce中只有map reduce两端,逻辑实现需要自己实现, Spark中有各种场景算子适用不同的场景。
    spark中做了很多已有的算子的封装,提供了各种场景的算子,而MR中只有map和reduce 相当于Spark中的map和reduceByKey两个算子
  5. Spark是粗粒度资源申请,Application执行快,MR是细粒度资源申请
  6. Spark中shuffle map端自动聚合功能,MR需要手动设置
  7. Spark中shuffle ByPass机制有自己灵活的实现

3.Spark运行模式(部署模式)

  • Local

    在本地eclipse、IDEA中写spark代码运行程序,一般用于测试

  • Standalone

    spark自带的资源调度框架(可以抛开hdfs,抛开yarn去运行),支持完全分布式集群搭建。Spark可以运行在standalone集群上

  • Yarn

    Hadoop生态圈里面的一个资源调度框架,Spark也是可以基于Yarn来计算的。

    要基于Yarn来进行资源调度,必须实现AppalicationMaster接口,Spark实现了这个接口,所以可以基于Yarn。

  • Mesos

    运行在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算,(很少用)

4.RDD五大特性

  1. RDD是由一系列的partition组成的。
  2. 算子(函数)是作用在RDD的每一个partition(split)上的。
    算子:Spark中,RDD的方法就叫算子(也叫函数)如flatMap,map,reduceByKey,foreach
  3. RDD之间有一系列的依赖关系,可以基于上一个RDD重新计算出RDD。。
    RDD2丢失了的话,可以将flatMap作用到RDD1上来生成RDD2
    RDD2依赖于RDD1产生,RDD3依赖于RDD2来产生
  4. 分区器是作用在K,V格式的RDD上。
    分区器:决定数据去哪一个分区 hash()%reduce个数
  5. Partition对外提供最佳的计算位置,利于数据处理的本地化。“计算移动,数据不移动”
    如要处理某个节点上的数据时

5.RDD的弹性体现在什么方面?

1.自动进行内存和磁盘数据存储的切换

Spark优先把数据放到内存中,如果内存放不下,就会放到磁盘里面,程序进行自动的存储切换

2.基于Lineage(血统)的高效容错机制

在RDD进行转换和动作的时候,会形成RDD的Lineage依赖链,当某一个RDD失效的时候,可以通过重新计算上游的RDD来重新生成丢失的RDD数据。

3.Task 如果失败会自动进行特定次数的重试

默认重试次数是4次。

TaskSchedulerImpl 是底层任务调度TaskScheduler的实现,这些Schedulers 从每一个Stage 中的DAGScheduler 中获取TaskSet,运行它们会尝试是否有故障。

4.Stage 如果失败会自动进行特定次数的重试,而且只会计算失败的分片

Stage 类注释

Finally, a single stage can be re-executed in multiple attempts due to fault recovery. In that* case, the Stage object will track multiple StageInfo objects to pass to listeners or the web UI.* The latest one will be accessible through latestInfo.

5.checkpoint 和persist,可主动或被动触发

RDD可以通过Persist持久化将RDD缓存到内存或者磁盘,当再次用到该RDD时直接读取就行。也可以将RDD进行检查点,检查点会将数据存储在HDFS中,该RDD的所有父RDD依赖都会被移除

checkpoint【每次对RDD操作都会产生新的RDD,如果链条比较长,计算比较笨重,就把数据放在硬盘中】和persist 【内存或磁盘中对数据进行复用】(检查点、持久化)

6.数据调度弹性: DAGScheduler ,TASKScheduler调度 和资源管理无关

Spark 将Job执行模型抽象为通用的有向无环图(DAG),这可以将多Stage的任务串联或并行执行,从而不需要将Stage 中间结果写到HDFS 中,调度引擎自动处理Stage的失败以及Task的失败。

7.数据分片的高度弹性(coalesce,repartition)

可以根据业务的特征,动态调整数据分片的个数,提升整体的应用执行效率。

原文地址:https://www.cnblogs.com/chenxiaoge/p/13335453.html