写点什么

大数据培训:Spark 高频面试题汇总

作者:@零度
  • 2022 年 3 月 02 日
  • 本文字数:5920 字

    阅读完需:约 19 分钟

1. 通常来说,Spark 与 MapReduce 相比,Spark 运行效率更高。请说明效率更高来源于 Spark 内置的哪些机制?

spark 是借鉴了 Mapreduce,并在其基础上发展起来的,继承了其分布式计算的优点并进行了改进,spark 生态更为丰富,功能更为强大,性能更加适用范围广,mapreduce 更简单,稳定性好。主要区别

(1)spark 把运算的中间数据(shuffle 阶段产生的数据)存放在内存,迭代计算效率更高,mapreduce 的中间结果需要落地,保存到磁盘

(2)Spark 容错性高,它通过弹性分布式数据集 RDD 来实现高效容错,RDD 是一组分布式的存储在 节点内存中的只读性的数据集,这些集合石弹性的,某一部分丢失或者出错,可以通过整个数据集的计算流程的血缘关系来实现重建,mapreduce 的容错只能重新计算



(3)Spark 更通用,提供了 transformation 和 action 这两大类的多功能 api,另外还有流式处理 sparkstreaming 模块、图计算等等,mapreduce 只提供了 map 和 reduce 两种操作,流计算及其他的模块支持比较缺乏

(4)Spark 框架和生态更为复杂,有 RDD,血缘 lineage、执行时的有向无环图 DAG,stage 划分等,很多时候 spark 作业都需要根据不同业务场景的需要进行调优以达到性能要求,mapreduce 框架及其生态相对较为简单,对性能的要求也相对较弱,运行较为稳定,适合长期后台运行。

(5)Spark 计算框架对内存的利用和运行的并行度比 mapreduce 高,Spark 运行容器为 executor,内部 ThreadPool 中线程运行一个 Task,mapreduce 在线程内部运行 container,container 容器分类为 MapTask 和 ReduceTask.程序运行并行度高

(6)Spark 对于 executor 的优化,在 JVM 虚拟机的基础上对内存弹性利用:storage memory 与 Execution memory 的弹性扩容,使得内存利用效率更高

2. hadoop 和 spark 使用场景?

Hadoop/MapReduce 和 Spark 最适合的都是做离线型的数据分析,但 Hadoop 特别适合是单次分析的数据量“很大”的情景,而 Spark 则适用于数据量不是很大的情景。

  • 一般情况下,对于中小互联网和企业级的大数据应用而言,单次分析的数量都不会“很大”,因此可以优先考虑使用 Spark。

  • 业务通常认为 Spark 更适用于机器学习之类的“迭代式”应用,80GB 的压缩数据(解压后超过 200GB),10 个节点的集群规模,跑类似“sum+group-by”的应用,MapReduce 花了 5 分钟,而 spark 只需要 2 分钟。

3. spark 如何保证宕机迅速恢复?

适当增加 spark standby master 编写 shell 脚本,定期检测 master 状态,出现宕机后对 master 进行重启操作

4. hadoop 和 spark 的相同点和不同点?

Hadoop 底层使用 MapReduce 计算架构,只有 map 和 reduce 两种操作,表达能力比较欠缺,而且在 MR 过程中会重复的读写 hdfs,造成大量的磁盘 io 读写操作,所以适合高时延环境下批处理计算的应用;

Spark 是基于内存的分布式计算架构,提供更加丰富的数据集操作类型,主要分成转化操作和行动操作,包括 map、reduce、filter、flatmap、groupbykey、reducebykey、union 和 join 等,数据分析更加快速,所以适合低时延环境下计算的应用;

spark 与 hadoop 最大的区别在于迭代式计算模型。基于 mapreduce 框架的 Hadoop 主要分为 map 和 reduce 两个阶段,两个阶段完了就结束了,所以在一个 job 里面能做的处理很有限;spark 计算模型是基于内存的迭代式计算模型,可以分为 n 个阶段,根据用户编写的 RDD 算子和程序,在处理完一个阶段后可以继续往下处理很多个阶段,而不只是两个阶段。所以 spark 相较于 mapreduce,计算模型更加灵活,可以提供更强大的功能。

但是 spark 也有劣势,由于 spark 基于内存进行计算,虽然开发容易,但是真正面对大数据的时候,在没有进行调优的轻局昂下,可能会出现各种各样的问题,比如 OOM 内存溢出等情况,导致 spark 程序可能无法运行起来,而 mapreduce 虽然运行缓慢,但是至少可以慢慢运行完_大数据培训

5. RDD 持久化原理?

spark 非常重要的一个功能特性就是可以将 RDD 持久化在内存中。

调用 cache()和 persist()方法即可。cache()和 persist()的区别在于,cache()是 persist()的一种简化方式,cache()的底层就是调用 persist()的无参版本 persist(MEMORY_ONLY),将数据持久化到内存中。

如果需要从内存中清除缓存,可以使用 unpersist()方法。RDD 持久化是可以手动选择不同的策略的。在调用 persist()时传入对应的 StorageLevel 即可。

6. checkpoint 检查点机制?

应用场景:当 spark 应用程序特别复杂,从初始的 RDD 开始到最后整个应用程序完成有很多的步骤,而且整个应用运行时间特别长,这种情况下就比较适合使用 checkpoint 功能。

原因:对于特别复杂的 Spark 应用,会出现某个反复使用的 RDD,即使之前持久化过但由于节点的故障导致数据丢失了,没有容错机制,所以需要重新计算一次数据。

Checkpoint 首先会调用 SparkContext 的 setCheckPointDIR()方法,设置一个容错的文件系统的目录,比如说 HDFS;然后对 RDD 调用 checkpoint()方法。之后在 RDD 所处的 job 运行结束之后,会启动一个单独的 job,来将 checkpoint 过的 RDD 数据写入之前设置的文件系统,进行高可用、容错的类持久化操作。

检查点机制是我们在 spark streaming 中用来保障容错性的主要机制,它可以使 spark streaming 阶段性的把应用数据存储到诸如 HDFS 等可靠存储系统中,以供恢复时使用。具体来说基于以下两个目的服务:

  • 控制发生失败时需要重算的状态数。Spark streaming 可以通过转化图的谱系图来重算状态,检查点机制则可以控制需要在转化图中回溯多远。

  • 提供驱动器程序容错。如果流计算应用中的驱动器程序崩溃了,你可以重启驱动器程序并让驱动器程序从检查点恢复,这样 spark streaming 就可以读取之前运行的程序处理数据的进度,并从那里继续。

7. checkpoint 和持久化机制的区别?

最主要的区别在于持久化只是将数据保存在 BlockManager 中,但是 RDD 的 lineage(血缘关系,依赖关系)是不变的。但是 checkpoint 执行完之后,rdd 已经没有之前所谓的依赖 rdd 了,而只有一个强行为其设置的 checkpointRDD,checkpoint 之后 rdd 的 lineage 就改变了。

持久化的数据丢失的可能性更大,因为节点的故障会导致磁盘、内存的数据丢失。但是 checkpoint 的数据通常是保存在高可用的文件系统中,比如 HDFS 中,所以数据丢失可能性比较低

8. RDD 机制理解吗?

  • rdd 分布式弹性数据集,简单的理解成一种数据结构,是 spark 框架上的通用货币。所有算子都是基于 rdd 来执行的,不同的场景会有不同的 rdd 实现类,但是都可以进行互相转换。rdd 执行过程中会形成 dag 图,然后形成 lineage 保证容错性等。从物理的角度来看 rdd 存储的是 block 和 node 之间的映射。

  • RDD 是 spark 提供的核心抽象,全称为弹性分布式数据集。

  • RDD 在逻辑上是一个 hdfs 文件,在抽象上是一种元素集合,包含了数据。它是被分区的,分为多个分区,每个分区分布在集群中的不同结点上,从而让 RDD 中的数据可以被并行操作(分布式数据集)

  • 比如有个 RDD 有 90W 数据,3 个 partition,则每个分区上有 30W 数据。RDD 通常通过 Hadoop 上的文件,即 HDFS 或者 HIVE 表来创建,还可以通过应用程序中的集合来创建;RDD 最重要的特性就是容错性,可以自动从节点失败中恢复过来。即如果某个结点上的 RDD partition 因为节点故障,导致数据丢失,那么 RDD 可以通过自己的数据来源重新计算该 partition。这一切对使用者都是透明的。

  • RDD 的数据默认存放在内存中,但是当内存资源不足时,spark 会自动将 RDD 数据写入磁盘。比如某结点内存只能处理 20W 数据,那么这 20W 数据就会放入内存中计算,剩下 10W 放到磁盘中。RDD 的弹性体现在于 RDD 上自动进行内存和磁盘之间权衡和切换的机制。

9. Spark streaming 以及基本工作原理?

Spark streaming 是 spark core API 的一种扩展,可以用于进行大规模、高吞吐量、容错的实时数据流的处理。

它支持从多种数据源读取数据,比如 Kafka、Flume、Twitter 和 TCP Socket,并且能够使用算子比如 map、reduce、join 和 window 等来处理数据,处理后的数据可以保存到文件系统、数据库等存储中。

Spark streaming 内部的基本工作原理是:接受实时输入数据流,然后将数据拆分成 batch,比如每收集一秒的数据封装成一个 batch,然后将每个 batch 交给 spark 的计算引擎进行处理,最后会生产处一个结果数据流,其中的数据也是一个一个的 batch 组成的。

移步:4w 字 Spark 调优宝典(推荐收藏)

10. DStream 以及基本工作原理?

  • DStream 是 spark streaming 提供的一种高级抽象,代表了一个持续不断的数据流。

  • DStream 可以通过输入数据源来创建,比如 Kafka、flume 等,也可以通过其他 DStream 的高阶函数来创建,比如 map、reduce、join 和 window 等。

  • DStream 内部其实不断产生 RDD,每个 RDD 包含了一个时间段的数据。

  • Spark streaming 一定是有一个输入的 DStream 接收数据,按照时间划分成一个一个的 batch,并转化为一个 RDD,RDD 的数据是分散在各个子节点的 partition 中。

11. spark 有哪些组件?

  • master:管理集群和节点,不参与计算。

  • worker:计算节点,进程本身不参与计算,和 master 汇报。

  • Driver:运行程序的 main 方法,创建 spark context 对象。

  • spark context:控制整个 application 的生命周期,包括 dagsheduler 和 task scheduler 等组件。

  • client:用户提交程序的入口。

12. spark 工作机制?

用户在 client 端提交作业后,会由 Driver 运行 main 方法并创建 spark context 上下文。执行 add 算子,形成 dag 图输入 dagscheduler,按照 add 之间的依赖关系划分 stage 输入 task scheduler。task scheduler 会将 stage 划分为 task set 分发到各个节点的 executor 中执行。

13. 说下宽依赖和窄依赖

宽依赖:本质就是 shuffle。父 RDD 的每一个 partition 中的数据,都可能会传输一部分到下一个子 RDD 的每一个 partition 中,此时会出现父 RDD 和子 RDD 的 partition 之间具有交互错综复杂的关系,这种情况就叫做两个 RDD 之间是宽依赖。

窄依赖:父 RDD 和子 RDD 的 partition 之间的对应关系是一对一的。

14. Spark 主备切换机制原理知道吗?

Master 实际上可以配置两个,Spark 原生的 standalone 模式是支持 Master 主备切换的。当 Active Master 节点挂掉以后,我们可以将 Standby Master 切换为 Active Master。

Spark Master 主备切换可以基于两种机制,一种是基于文件系统的,一种是基于 ZooKeeper 的。

基于文件系统的主备切换机制,需要在 Active Master 挂掉之后手动切换到 Standby Master 上;

而基于 Zookeeper 的主备切换机制,可以实现自动切换 Master。

15. spark 解决了 hadoop 的哪些问题?

  • MR:抽象层次低,需要使用手工代码来完成程序编写,使用上难以上手;

  • Spark:Spark 采用 RDD 计算模型,简单容易上手。

  • MR:只提供 map 和 reduce 两个操作,表达能力欠缺;

  • Spark:Spark 采用更加丰富的算子模型,包括 map、flatmap、groupbykey、reducebykey 等;

  • MR:一个 job 只能包含 map 和 reduce 两个阶段,复杂的任务需要包含很多个 job,这些 job 之间的管理以来需要开发者自己进行管理;

  • Spark:Spark 中一个 job 可以包含多个转换操作,在调度时可以生成多个 stage,而且如果多个 map 操作的分区不变,是可以放在同一个 task 里面去执行;

  • MR:中间结果存放在 hdfs 中;

  • Spark:Spark 的中间结果一般存在内存中,只有当内存不够了,才会存入本地磁盘,而不是 hdfs;

  • MR:只有等到所有的 map task 执行完毕后才能执行 reduce task;

  • Spark:Spark 中分区相同的转换构成流水线在一个 task 中执行,分区不同的需要进行 shuffle 操作,被划分成不同的 stage 需要等待前面的 stage 执行完才能执行。

  • MR:只适合 batch 批处理,时延高,对于交互式处理和实时处理支持不够;

  • Spark:Spark streaming 可以将流拆成时间间隔的 batch 进行处理,实时计算。

16. 数据倾斜的产生和解决办法?

数据倾斜以为着某一个或者某几个 partition 的数据特别大,导致这几个 partition 上的计算需要耗费相当长的时间。

在 spark 中同一个应用程序划分成多个 stage,这些 stage 之间是串行执行的,而一个 stage 里面的多个 task 是可以并行执行,task 数目由 partition 数目决定,如果一个 partition 的数目特别大,那么导致这个 task 执行时间很长,导致接下来的 stage 无法执行,从而导致整个 job 执行变慢。

避免数据倾斜,一般是要选用合适的 key,或者自己定义相关的 partitioner,通过加盐或者哈希值来拆分这些 key,从而将这些数据分散到不同的 partition 去执行。

如下算子会导致 shuffle 操作,是导致数据倾斜可能发生的关键点所在:groupByKey;reduceByKey;aggregaByKey;join;cogroup;

17. 你用 sparksql 处理的时候, 处理过程中用的 dataframe 还是直接写的 sql?为什么?

这个问题的宗旨是问你 spark sql 中 dataframe 和 sql 的区别,从执行原理、操作方便程度和自定义程度来分析这个问题。

18. 现场写一个笔试题

有 hdfs 文件,文件每行的格式为作品 ID,用户 id,用户性别。请用一个 spark 任务实现以下功能:统计每个作品对应的用户(去重后)的性别分布。输出格式如下:作品 ID,男性用户数量,女性用户数量

答案:

sc.textfile() .flatmap(.split(","))//分割成作

品 ID,用户 id,用户性别

.map(((_.1,_._2),1))//((作品 id,用户性别),1)

.reduceByKey(_+_)//((作品 id,用户性别),n)

.map(_._1._1,_._1._2,_._2)//(作品 id,用户性别,n)

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

reduceByKey:reduceByKey 会在结果发送至 reducer 之前会对每个 mapper 在本地进行 merge,有点类似于在 MapReduce 中的 combiner。这样做的好处在于,在 map 端进行一次 reduce 之后,数据量会大幅度减小,从而减小传输,保证 reduce 端能够更快的进行结果计算。

groupByKey:groupByKey 会对每一个 RDD 中的 value 值进行聚合形成一个序列(Iterator),此操作发生在 reduce 端,所以势必会将所有的数据通过网络进行传输,造成不必要的浪费。同时如果数据量十分大,可能还会造成 OutOfMemoryError。

所以在进行大量数据的 reduce 操作时候建议使用 reduceByKey。不仅可以提高速度,还可以防止使用 groupByKey 造成的内存溢出问题。

20. Spark master HA 主从切换过程不会影响到集群已有作业的运行,为什么

不会的。

因为程序在运行之前,已经申请过资源了,driver 和 Executors 通讯,不需要和 master 进行通讯的。

21. spark master 使用 zookeeper 进行 ha,有哪些源数据保存到 Zookeeper 里面

spark 通过这个参数 spark.deploy.zookeeper.dir 指定 master 元数据在 zookeeper 中保存的位置,包括 Worker,Driver 和 Application 以及 Executors。standby 节点要从 zk 中,获得元数据信息,恢复集群运行状态,才能对外继续提供服务,作业提交资源申请等,在恢复前是不能接受请求的。

1、在 Master 切换的过程中,所有的已经在运行的程序皆正常运行!

因为 Spark Application 在运行前就已经通过 Cluster Manager 获得了

计算资源,所以在运行时 Job 本身的

调度和处理和 Master 是没有任何关系。

2、在 Master 的切换过程中唯一的影响是不能提交新的 Job:

一方面不能够提交新的应用程序给集群,

因为只有 Active Master 才能接受新的程序的提交请求;

另外一方面,已经运行的程序中也不能够因

Action 操作触发新的 Job 的提交请求。

文章来源于肉眼品世界

用户头像

@零度

关注

关注尚硅谷,轻松学IT 2021.11.23 加入

还未添加个人简介

评论

发布
暂无评论
大数据培训:Spark高频面试题汇总_大数据_@零度_InfoQ写作平台