文章目录
- 1. Spark VS Hadoop区别?
- 2. Hadoop的基于进程的计算和Spark基于线程方式优缺点?
- 3. Spark四大特点
- 4. Spark的架构角色
- 5. Spark运行模式
- 6. Job\State\Task的关系?
- 7. Python On Spark 执行原理
- 8. RDD
- 9. RDD算子
- 10. groupByKey和reduceByKey的区别
- 11. 宽窄依赖
- 12. Spark是怎么做内存计算的?DAG的作用?Stage阶段划分的作用?
- 13. Spark为什么比Mapreduce快?
- 14. Spark Shuffle
- 15. Spark 常用端口号
- 16. Hive on Spark 和 Spark on Hive 区别
- 17. SparkSQL 中 RDD、DataFrame、DataSet 三者的转换及区别
- 18. Spark 内核源码(重点)
- 19. Spark统一内存模型
- 20. Spark Shuffle 和 Hadoop Shuffle 区别?
- 21. Spark 提交作业参数(重点)
- 22. Spark 任务使用什么进行提交,JavaEE界面还是脚本
- 23. 请列举会引起Shuffle过程的Spark算子,并简述功能。
- 24. Spark 操作数据库时,如何减少Spark运行中的数据库连接数?
- 25. Spark 数据倾斜
- 26. Spark中OOM问题
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运行模式
-
Local模式
- Local模式可以限制模拟Spark集群环境的线程数量, 即Local[N] 或Local[*]
- 其中N代表可以使用N个线程,每个线程拥有一个cpu core。如果不指定N,则默认是1个线程(该线程有1个core)。通常Cpu有几个Core,就指定几个线程,最大化利用计算能力。
-
Standalone模式
StandAlone 是完整的Spark运行环境,其中:
- Master角色以Master进程存在, Worker角色以Worker进程存在
- Driver和Executor运行于Worker进程内, 由Worker提供资源供给它们运行
-
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 算子分类
-
Transformation:转换算子
定义:RDD的算子,返回值仍旧是一个RDD的,称之为转换算子
特性:这类算子是lazy 懒加载的。如果没有action算子,Transformation算子是不工作的 -
Action:行动算子
定义:返回值不是rdd的就是action算子
9.3 Spark 的转换算子
- 单value
-
map算子
-
mapPartitions算子
相对于map算子,减少了io的传输效率,提高了系统的性能。
-
flatMap算子
-
groupBy算子
-
Filter算子
-
Distinct算子
-
coalesce 和 repartition算子
repartition算子:
coalesce算子:
-
sortBy算子
- 双value
- intersection算子
- union算子
- 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 区别
- 关系:
两者都是用来改变 RDD 的 partition 数量的, repartition 底层调用的就是 coalesce 方法:coalesce (numPartitions, shuffle = true)
。 - 区别:
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。
转换与区别:
三者的共性:
- RDD、DataFrame、DataSet全都是Spark平台下的分布式弹性数据集,为处理超大型数据提供便利。
- 三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action行动算子如foreach时,三者才会开始遍历运算。
- 三者有许多共同的函数,如filter,排序等。
- 三者都会根据Spark的内存情况自动缓存运算。
- 三者都有分区的概念。
18. Spark 内核源码(重点)
19. Spark统一内存模型
20. Spark Shuffle 和 Hadoop Shuffle 区别?
- Hadoop 不用等所有的MapTask都结束后开启ReduceTask;Spark必须等到父Stage
都完成,才能去提取数据。 - 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问题的原因及解决方法包括以下几方面:
- 数据量过大
- 原因:
Spark任务处理的数据量过大,超过了可用内存。 - 解决方法:
- 调整Spark作业的分区数,使每个分区的数据量适合可用内存。
- 使用压缩格式(如Parquet、ORC)存储数据,减少内存占用。
- 使用分布式文件系统(如HDFS)存储数据。
- 缓存数据量过大
- 原因:
过多的数据被缓存到内存中,导致内存不足。 - 解决方法:
- 只缓存必要的数据,及时释放不再需要的缓存。
- 使用
unpersist
方法手动清除不需要的缓存数据。
- 数据倾斜
- 原因:
数据分布不均匀,部分节点处理的数据量过大,导致内存溢出。 - 解决方法:
- 优化数据分区,使数据均匀分布。
- 使用
salting
方法,将倾斜的key进行拆分。
- Shuffle操作
- 原因:
Shuffle过程中需要大量内存进行数据交换和排序。 - 解决方法:
- 增加
spark.shuffle.memoryFraction
配置,增加Shuffle操作的内存分配。 - 使用磁盘进行Shuffle中间数据的存储,减少内存压力。
- 增加
- JVM内存配置不足
- 原因:
JVM堆内存配置不足,导致内存溢出。 - 解决方法:
- 调整Spark作业的内存参数配置,如
spark.executor.memory
和spark.driver.memory
。 - 优化JVM的GC策略,减少垃圾回收的影响。
- 调整Spark作业的内存参数配置,如
- 高并发任务
- 原因:
高并发任务导致内存分配不均,容易造成内存溢出。 - 解决方法:
- 控制并发任务的数量,合理分配资源。
- 调整
spark.task.cpus
配置,限制每个任务使用的CPU数量。
通过合理配置和优化,可以有效减少Spark中OOM问题的发生,提高作业的稳定性和性能。