Spark面试重点

1. Spark VS Hadoop区别?

在这里插入图片描述

2. Hadoop的基于进程的计算和Spark基于线程方式优缺点?

Hadoop中的MR中每个map/reduce task都是一个java进程方式运行,好处在于进程之间是互相独立的,每个task独享进程资源,没有互相干扰,监控方便,但是问题在于task之间不方便共享数据,执行效率比较低。比如多个map task读取不同数据源文件需要将数据源加载到每个map task中,造成重复加载和浪费内存。而基于线程的方式计算是为了数据共享和提高执行效率,Spark采用了线程的最小的执行单位,但缺点是线程之间会有资源竞争

3. Spark四大特点

  • 速度快
  • 易于使用
  • 通用性强
  • 支持多种运行方式

4. Spark的架构角色

在这里插入图片描述

5. Spark运行模式

  1. Local模式

    • Local模式可以限制模拟Spark集群环境的线程数量, 即Local[N] 或Local[*]
    • 其中N代表可以使用N个线程,每个线程拥有一个cpu core。如果不指定N,则默认是1个线程(该线程有1个core)。通常Cpu有几个Core,就指定几个线程,最大化利用计算能力。
  2. Standalone模式

    StandAlone 是完整的Spark运行环境,其中:

    • Master角色以Master进程存在, Worker角色以Worker进程存在
    • Driver和Executor运行于Worker进程内, 由Worker提供资源供给它们运行
      在这里插入图片描述
  3. SparkOnYarn模式

  • Master角色由YARN的ResourceManager担任
  • Worker角色由YARN的NodeManager担任
  • Driver角色运行在YARN容器内或提交任务的客户端进程中
  • 真正干活的Executor运行在YARN提供的容器内
    在这里插入图片描述
    【注】Spark On YARN是有两种运行模式的,一种是Cluster模式一种是Client模式
    Cluster模式即:Driver运行在YARN容器内部, 和ApplicationMaster在同一个容器内
    Client模式即:Driver运行在客户端进程中, 比如Driver运行在spark-submit程序的进程中

6. Job\State\Task的关系?

一个Spark程序会被分成多个子任务(Job)运行, 每一个Job会分成多个State(阶段)来
运行, 每一个State内会分出来多个Task(线程)来执行具体任务

7. Python On Spark 执行原理

PySpark宗旨是在不破坏Spark已有的运行时架构,在Spark架构外层包装一层Python API,借助Py4j实现Python和Java的交互,进而实现通过Python编写Spark应用程序,其运行时架构如下图所示。
在这里插入图片描述

8. RDD

8.1 什么是RDD?

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算的集合。

Resilient:RDD中的数据可以存储在内存中或者磁盘中

8.2 RDD的特性

  • RDD是有分区的,RDD的分区是RDD数据存储的最小单位
  • RDD的方法会作用在其所有的分区上
  • RDD之间是有依赖关系(RDD有血缘关系)

8.3 RDD 弹性体现在哪里?

主要表现为存储弹性计算弹性任务 (Task 、 Stage) 弹性数据位置弹性, 具体如 下:
(1) 自动进行内存和磁盘切换
(2) 基于 lineage 的高效容错
(3) Task 如果失败会特定次数的重试
(4) Stage 如果失败会自动进行特定次数的重试, 而且只会只计算失败的分片
(5) Checkpoint 【每次对 RDD 操作都会产生新的 RDD, 如果链条比较长, 计算比较
笨重, 就把数据放在硬盘中】和 persist 【内存或磁盘中对数据进行复用】(检查点、持久化)
(6) 数据调度弹性: DAG Task 和资源管理无关
(7) 数据分片的高度弹性 repartion

9. RDD算子

9.1 算子是什么?

分布式对象的API,叫做算子

9.2 算子分类

  1. Transformation:转换算子
    定义:RDD的算子,返回值仍旧是一个RDD的,称之为转换算子
    特性:这类算子是lazy 懒加载的。如果没有action算子,Transformation算子是不工作的

  2. Action:行动算子

    定义:返回值不是rdd的就是action算子
    在这里插入图片描述

9.3 Spark 的转换算子

  1. 单value
  • map算子
    在这里插入图片描述
    在这里插入图片描述

  • mapPartitions算子
    相对于map算子,减少了io的传输效率,提高了系统的性能。
    在这里插入图片描述

  • flatMap算子
    在这里插入图片描述

  • groupBy算子
    在这里插入图片描述

  • Filter算子
    在这里插入图片描述

  • Distinct算子
    在这里插入图片描述

  • coalesce 和 repartition算子
    repartition算子:
    在这里插入图片描述
    coalesce算子:
    在这里插入图片描述

  • sortBy算子
    在这里插入图片描述

  1. 双value
  • intersection算子
    在这里插入图片描述
  • union算子
    在这里插入图片描述
  1. Key-Value
  • partitionBy
    在这里插入图片描述
    在这里插入图片描述
  • reduceByKey
    在这里插入图片描述
  • groupByKey
    在这里插入图片描述
  • sortByKey
    在这里插入图片描述
    在这里插入图片描述
  • mapValues
    在这里插入图片描述
  • join
    在这里插入图片描述

9.4 Spark 的行动算子

  • reduce
    在这里插入图片描述

  • collect
    在这里插入图片描述

  • count
    在这里插入图片描述

  • first
    在这里插入图片描述

  • take
    在这里插入图片描述

9.5 map 和 mapPartitions 区别

(1) map: 每次处理一条数据
(2) mapPartitions: 每次处理一个分区数据

9.6 Repartition 和 Coalesce 区别

  1. 关系:
    两者都是用来改变 RDD 的 partition 数量的, repartition 底层调用的就是 coalesce 方法: coalesce (numPartitions, shuffle = true)
  2. 区别:
    repartition 一定会发生 Shuffle, coalesce 根据传入的参数来判断是否发生 Shuffle。
    一般情况下增大 rdd 的 partition 数量使用 repartition,减少 partition 数量时使用 coalesce。

10. groupByKey和reduceByKey的区别

在这里插入图片描述
groupByKey执行流程:
在这里插入图片描述
reduceByKey执行流程:
在这里插入图片描述

11. 宽窄依赖

在这里插入图片描述

11.1 spark之间的宽窄依赖的不同点是什么?*

窄依赖(Narrow Dependency)
依赖关系:一个子RDD的每个分区只依赖于父RDD的一个或少数几个分区。
优点

  • 高任务并行度
  • 低网络传输
  • 高容错性
  • 操作:map()、filter()、flatMap()、mapPartitions()

宽依赖(Wide Dependency)
依赖关系:一个子RDD的每个分区依赖于父RDD的多个分区。
缺点

  • 低任务并行度
  • 高网络传输
  • 低容错性
  • 操作:reduceByKey()、groupByKey()、join()、cogroup()

12. Spark是怎么做内存计算的?DAG的作用?Stage阶段划分的作用?

在这里插入图片描述
Spark执行流程:
在这里插入图片描述

13. Spark为什么比Mapreduce快?

  • Spark算子丰富,Map reduce算子匮乏,Mapreduce很难处理复杂的任务,要想解决复杂的任务,需要写多个MapReduce程序进行串联,多个MR串联通过磁盘交互数据
  • Spark可以执行内存迭代,算子之间形成DAG并基于依赖划分阶段后,在阶段内形成内存迭代管道。但是MapReduce的Map和Reduce之间的交互依旧是通过磁盘来交互的
  • MR任务以进程的方式运行在Yarn集群中。N个MapTask就要申请N个进程。Spark 的任务是以线程的方式运行在进程中。N个MapTask就要申请N个线程。

14. Spark Shuffle

DAG中的宽依赖就是Spark中的Shuffle过程
在这里插入图片描述

15. Spark 常用端口号

(1) 4040 spark-shell 任务端口
(2) 7077 内部通讯端口 。 类比 Hadoop 的 8020/9000
(3) 8080 查看任务执行情况端口 。 类比 Hadoop 的 8088
(4) 18080 历史服务器 。 类比 Hadoop 的 19888
注意: 由于 Spark 只负责计算, 所有并没有 Hadoop 中存储数据的端口 9870/50070。

16. Hive on Spark 和 Spark on Hive 区别

在这里插入图片描述

17. SparkSQL 中 RDD、DataFrame、DataSet 三者的转换及区别

RDD(Spark1.0)=》Dataframe(Spark1.3)=》Dataset(Spark1.6)

如果同样的数据都给到这三个数据结构,他们分别计算之后,都会给出相同的结果。不同的是他们的执行效率和执行方式。在现在的版本中,dataSet性能最好,已经成为了唯一使用的接口。其中Dataframe已经在底层被看做是特殊泛型的DataSet。

转换与区别:
在这里插入图片描述
三者的共性:

  1. RDD、DataFrame、DataSet全都是Spark平台下的分布式弹性数据集,为处理超大型数据提供便利。
  2. 三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action行动算子如foreach时,三者才会开始遍历运算。
  3. 三者有许多共同的函数,如filter,排序等。
  4. 三者都会根据Spark的内存情况自动缓存运算。
  5. 三者都有分区的概念。

18. Spark 内核源码(重点)

19. Spark统一内存模型

20. Spark Shuffle 和 Hadoop Shuffle 区别?

  1. Hadoop 不用等所有的MapTask都结束后开启ReduceTask;Spark必须等到父Stage
    都完成,才能去提取数据。
  2. Hadoop的Shuffle 是必须排序的,那么不管是Map的输出,还是Reduce的输出,
    都是分区内有序的,而Spark不要求这一点。

21. Spark 提交作业参数(重点)

22. Spark 任务使用什么进行提交,JavaEE界面还是脚本

Shell 脚本。海豚调度器可以通过页面提交Spark任务。

23. 请列举会引起Shuffle过程的Spark算子,并简述功能。

24. Spark 操作数据库时,如何减少Spark运行中的数据库连接数?

25. Spark 数据倾斜

26. Spark中OOM问题

在Spark中,OOM(Out of Memory,内存溢出)问题是指由于内存不足导致的程序异常或崩溃。这种情况在处理大规模数据时尤其常见。导致OOM问题的原因及解决方法包括以下几方面:

  1. 数据量过大
  • 原因
    Spark任务处理的数据量过大,超过了可用内存。
  • 解决方法
    • 调整Spark作业的分区数,使每个分区的数据量适合可用内存。
    • 使用压缩格式(如Parquet、ORC)存储数据,减少内存占用。
    • 使用分布式文件系统(如HDFS)存储数据。
  1. 缓存数据量过大
  • 原因
    过多的数据被缓存到内存中,导致内存不足。
  • 解决方法
    • 只缓存必要的数据,及时释放不再需要的缓存。
    • 使用unpersist方法手动清除不需要的缓存数据。
  1. 数据倾斜
  • 原因
    数据分布不均匀,部分节点处理的数据量过大,导致内存溢出。
  • 解决方法
    • 优化数据分区,使数据均匀分布。
    • 使用salting方法,将倾斜的key进行拆分。
  1. Shuffle操作
  • 原因
    Shuffle过程中需要大量内存进行数据交换和排序。
  • 解决方法
    • 增加spark.shuffle.memoryFraction配置,增加Shuffle操作的内存分配。
    • 使用磁盘进行Shuffle中间数据的存储,减少内存压力。
  1. JVM内存配置不足
  • 原因
    JVM堆内存配置不足,导致内存溢出。
  • 解决方法
    • 调整Spark作业的内存参数配置,如spark.executor.memoryspark.driver.memory
    • 优化JVM的GC策略,减少垃圾回收的影响。
  1. 高并发任务
  • 原因
    高并发任务导致内存分配不均,容易造成内存溢出。
  • 解决方法
    • 控制并发任务的数量,合理分配资源。
    • 调整spark.task.cpus配置,限制每个任务使用的CPU数量。

通过合理配置和优化,可以有效减少Spark中OOM问题的发生,提高作业的稳定性和性能。

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值