史上最全的spark面试题——持续更新中

article/2025/9/29 15:48:00

1.spark中的RDD是什么,有哪些特性?

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

Dataset:就是一个集合,用于存放数据的

Destributed:分布式,可以并行在集群计算

Resilient:表示弹性的,弹性表示

1.RDD中的数据可以存储在内存或者磁盘中;

2.RDD中的分区是可以改变的;

五大特性:

1.A list of partitions:一个分区列表,RDD中的数据都存储在一个分区列表中

2.A function for computing each split:作用在每一个分区中的函数

3.A list of dependencies on other RDDs:一个RDD依赖于其他多个RDD,这个点很重要,RDD的容错机制就是依据这个特性而来的

4.Optionally,a Partitioner for key-value RDDs(eg:to say that the RDD is hash-partitioned):可选的,针对于kv类型的RDD才有这个特性,作用是决定了数据的来源以及数据处理后的去向

5.可选项,数据本地性,数据位置最优

2.概述一下spark中的常用算子区别(map,mapPartitions,foreach,foreachPatition)

答:map:用于遍历RDD,将函数应用于每一个元素,返回新的RDD(transformation算子)

foreach:用于遍历RDD,将函数应用于每一个元素,无返回值(action算子)

mapPatitions:用于遍历操作RDD中的每一个分区,返回生成一个新的RDD(transformation算子)

foreachPatition:用于遍历操作RDD中的每一个分区,无返回值(action算子)

总结:一般使用mapPatitions和foreachPatition算子比map和foreach更加高效,推荐使用

3.谈谈spark中的宽窄依赖:

 

答:RDD和它的父RDD的关系有两种类型:窄依赖和宽依赖

宽依赖:指的是多个子RDD的Partition会依赖同一个父RDD的Partition,关系是一对多,父RDD的一个分区的数据去到子RDD的不同分区里面,会有shuffle的产生

窄依赖:指的是每一个父RDD的Partition最多被子RDD的一个partition使用,是一对一的,也就是父RDD的一个分区去到了子RDD的一个分区中,这个过程没有shuffle产生

区分的标准就是看父RDD的一个分区的数据的流向,要是流向一个partition的话就是窄依赖,否则就是宽依赖,如图所示:

4.spark中如何划分stage:

答:概念:Spark任务会根据RDD之间的依赖关系,形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把DAG划分相互依赖的多个stage,划分依据就是宽窄依赖,遇到宽依赖就划分stage,每个stage包含一个或多个task,然后将这些task以taskSet的形式提交给TaskScheduler运行,stage是由一组并行的task组成

1.spark程序中可以因为不同的action触发众多的job,一个程序中可以有很多的job,每一个job是由一个或者多个stage构成的,后面的stage依赖于前面的stage,也就是说只有前面依赖的stage计算完毕后,后面的stage才会运行;

2.stage 的划分标准就是宽依赖:何时产生宽依赖就会产生一个新的stage,例如reduceByKey,groupByKey,join的算子,会导致宽依赖的产生;

3.切割规则:从后往前,遇到宽依赖就切割stage;

4.图解:

5.计算格式:pipeline管道计算模式,piepeline只是一种计算思想,一种模式

6.spark的pipeline管道计算模式相当于执行了一个高阶函数,也就是说来一条数据然后计算一条数据,会把所有的逻辑走完,然后落地,而MapReduce是1+1=2,2+1=3这样的计算模式,也就是计算完落地,然后再计算,然后再落地到磁盘或者内存,最后数据是落在计算节点上,按reduce的hash分区落地。管道计算模式完全基于内存计算,所以比MapReduce快的原因。

7.管道中的RDD何时落地:shuffle write的时候,对RDD进行持久化的时候。

8.stage的task的并行度是由stage的最后一个RDD的分区数来决定的,一般来说,一个partition对应一个task,但最后reduce的时候可以手动改变reduce的个数,也就是改变最后一个RDD的分区数,也就改变了并行度。例如:reduceByKey(_+_,3)

9.优化:提高stage的并行度:reduceByKey(_+_,patition的个数) ,join(_+_,patition的个数)

4.DAGScheduler分析:

答:概述:是一个面向stage 的调度器;

主要入参有:dagScheduler.runJob(rdd, cleanedFunc, partitions, callSite, allowLocal,resultHandler, localProperties.get)

rdd: final RDD;

cleanedFunc: 计算每个分区的函数;

resultHander: 结果侦听器;

主要功能:1.接受用户提交的job;

2.将job根据类型划分为不同的stage,记录那些RDD,stage被物化,并在每一个stage内产生一系列的task,并封装成taskset;

3.决定每个task的最佳位置,任务在数据所在节点上运行,并结合当前的缓存情况,将taskSet提交给TaskScheduler;

4.重新提交shuffle输出丢失的stage给taskScheduler;

注:一个stage内部的错误不是由shuffle输出丢失造成的,DAGScheduler是不管的,由TaskScheduler负责尝试重新提交task执行。

5.Job的生成:

答:一旦driver程序中出现action,就会生成一个job,比如count等,向DAGScheduler提交job,如果driver程序后面还有action,那么其他action也会对应生成相应的job,所以,driver端有多少action就会提交多少job,这可能就是为什么spark将driver程序称为application而不是job 的原因。每一个job可能会包含一个或者多个stage,最后一个stage生成result,在提交job 的过程中,DAGScheduler会首先从后往前划分stage,划分的标准就是宽依赖,一旦遇到宽依赖就划分,然后先提交没有父阶段的stage们,并在提交过程中,计算该stage的task数目以及类型,并提交具体的task,在这些无父阶段的stage提交完之后,依赖该stage 的stage才会提交。

6.有向无环图:

答:DAG,有向无环图,简单的来说,就是一个由顶点和有方向性的边构成的图中,从任意一个顶点出发,没有任意一条路径会将其带回到出发点的顶点位置,为每个spark job计算具有依赖关系的多个stage任务阶段,通常根据shuffle来划分stage,如reduceByKey,groupByKey等涉及到shuffle的transformation就会产生新的stage ,然后将每个stage划分为具体的一组任务,以TaskSets的形式提交给底层的任务调度模块来执行,其中不同stage之前的RDD为宽依赖关系,TaskScheduler任务调度模块负责具体启动任务,监控和汇报任务运行情况。

7.RDD是什么以及它的分类:

8.RDD的操作

9.RDD缓存:

Spark可以使用 persist 和 cache 方法将任意 RDD 缓存到内存、磁盘文件系统中。缓存是容错的,如果一个 RDD 分片丢失,可以通过构建它的 transformation自动重构。被缓存的 RDD 被使用的时,存取速度会被大大加速。一般的executor内存60%做 cache, 剩下的40%做task。

Spark中,RDD类可以使用cache() 和 persist() 方法来缓存。cache()是persist()的特例,将该RDD缓存到内存中。而persist可以指定一个StorageLevel。StorageLevel的列表可以在StorageLevel 伴生单例对象中找到。

Spark的不同StorageLevel ,目的满足内存使用和CPU效率权衡上的不同需求。我们建议通过以下的步骤来进行选择:

·如果你的RDDs可以很好的与默认的存储级别(MEMORY_ONLY)契合,就不需要做任何修改了。这已经是CPU使用效率最高的选项,它使得RDDs的操作尽可能的快。

·如果不行,试着使用MEMORY_ONLY_SER并且选择一个快速序列化的库使得对象在有比较高的空间使用率的情况下,依然可以较快被访问。

·尽可能不要存储到硬盘上,除非计算数据集的函数,计算量特别大,或者它们过滤了大量的数据。否则,重新计算一个分区的速度,和与从硬盘中读取基本差不多快。

·如果你想有快速故障恢复能力,使用复制存储级别(例如:用Spark来响应web应用的请求)。所有的存储级别都有通过重新计算丢失数据恢复错误的容错机制,但是复制存储级别可以让你在RDD上持续的运行任务,而不需要等待丢失的分区被重新计算。

·如果你想要定义你自己的存储级别(比如复制因子为3而不是2),可以使用StorageLevel 单例对象的apply()方法。

在不会使用cached RDD的时候,及时使用unpersist方法来释放它。

10.RDD共享变量:

在应用开发中,一个函数被传递给Spark操作(例如map和reduce),在一个远程集群上运行,它实际上操作的是这个函数用到的所有变量的独立拷贝。这些变量会被拷贝到每一台机器。通常看来,在任务之间中,读写共享变量显然不够高效。然而,Spark还是为两种常见的使用模式,提供了两种有限的共享变量:广播变量和累加器。

(1). 广播变量(Broadcast Variables)

– 广播变量缓存到各个节点的内存中,而不是每个 Task

– 广播变量被创建后,能在集群中运行的任何函数调用

– 广播变量是只读的,不能在被广播后修改

– 对于大数据集的广播, Spark 尝试使用高效的广播算法来降低通信成本

  1. val broadcastVar = sc.broadcast(Array(1, 2, 3))方法参数中是要广播的变量

(2). 累加器

累加器只支持加法操作,可以高效地并行,用于实现计数器和变量求和。Spark 原生支持数值类型和标准可变集合的计数器,但用户可以添加新的类型。只有驱动程序才能获取累加器的值

11.spark-submit的时候如何引入外部jar包:

在通过spark-submit提交任务时,可以通过添加配置参数来指定 

  • –driver-class-path 外部jar包
  • –jars 外部jar包

12.spark如何防止内存溢出:

  • driver端的内存溢出 
    • 可以增大driver的内存参数:spark.driver.memory (default 1g)
    • 这个参数用来设置Driver的内存。在Spark程序中,SparkContext,DAGScheduler都是运行在Driver端的。对应rdd的Stage切分也是在Driver端运行,如果用户自己写的程序有过多的步骤,切分出过多的Stage,这部分信息消耗的是Driver的内存,这个时候就需要调大Driver的内存。
  • map过程产生大量对象导致内存溢出 
    • 这种溢出的原因是在单个map中产生了大量的对象导致的,例如:rdd.map(x=>for(i <- 1 to 10000

http://chatgpt.dhexx.cn/article/yN4LlQKa.shtml

相关文章

spark 面试题汇总

大数据面试题汇总 大数据面试题汇总 - 简书 spark 资源调优 1、列式存储和行式存储的区别 行存储&#xff0c;数据行存储&#xff0c;一个文件可表达一个二维表。适用于一般的业务场景如CSV文件&#xff0c;文本文件 因为这里的行结构是固定的&#xff0c;每一行都一样&…

Spark面试问题整理(持续更新中......)

Spark应用转换流程 1、 spark应用提交后&#xff0c;经历了一系列的转换&#xff0c;最后成为task在每个节点上执行 2、 RDD的Action算子触发Job的提交&#xff0c;生成RDD DAG 3、 由DAGScheduler将RDD DAG转化为Stage DAG&#xff0c;每个Stage中产生相应的Task集合 4、 Task…

大数据知识面试题-Spark(2022版)

序列号内容链接1大数据知识面试题-通用&#xff08;2022版&#xff09;https://blog.csdn.net/qq_43061290/article/details/1248190892大数据知识面试题-Hadoop&#xff08;2022版&#xff09;https://blog.csdn.net/qq_43061290/article/details/1248222933大数据知识面试题-…

Spark面试,Spark面试题,Spark面试汇总

Table of Contents 1、你觉得spark 可以完全替代hadoop 么? 2、Spark消费 Kafka&#xff0c;分布式的情况下&#xff0c;如何保证消息的顺序? 3、对于 Spark 中的数据倾斜问题你有什么好的方案&#xff1f; 4、你所理解的 Spark 的 shuffle 过程&#xff1f; 5、Spark有…

Spark高频面试题总结

1. Spark高频面试题总结 1.1 Spark有几种部署方式&#xff1f;请分别简要论述 Local:运行在一台机器上&#xff0c;通常是练手或者测试环境。 Standalone:构建一个基于MsterSlaves的资源调度集群&#xff0c;Spark任务提交给Master运行。是Spark自身的一个调度系统。 Yarn: …

【大数据面试题】(八)Spark 相关面试题

1.spark中的RDD是什么&#xff0c;有哪些特性&#xff1f; 答&#xff1a;RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做分布式数据集&#xff0c;是spark中最基本的数据抽象&#xff0c;它代表一个不可变&#xff0c;可分区&#xff0c;里面的元素可以并行计…

spark面试题总结

文章目录 一、你是怎么理解Spark&#xff0c;它的特点是什么&#xff1f;二、Spark有几种部署方式&#xff0c;请分别简要论述三、Spark提交作业的参数四、简述Spark的作业提交流程五、你是如何理解Spark中血统(RDD)的概念?它的作用是什么&#xff1f;六、简述Spark的宽窄依赖…

Spark高频面试题(建议收藏)

一、你是怎么理解Spark&#xff0c;它的特点是什么&#xff1f; Spark是一个基于内存的&#xff0c;用于大规模数据处理&#xff08;离线计算、实时计算、快速查询&#xff08;交互式查询&#xff09;&#xff09;的统一分析引擎。 它内部的组成模块&#xff0c;包含SparkCore&…

Spark面试题汇总及答案(推荐收藏)

一、面试题 Spark 通常来说&#xff0c;Spark与MapReduce相比&#xff0c;Spark运行效率更高。请说明效率更高来源于Spark内置的哪些机制&#xff1f;hadoop和spark使用场景&#xff1f;spark如何保证宕机迅速恢复?hadoop和spark的相同点和不同点&#xff1f;RDD持久化原理&am…

日报日报!Spark综合面试题总结

Spark 什么是Spark 基于内存的&#xff0c;用于大规模数据处理&#xff08;离线计算、实时计算、快速查询&#xff08;交互式查询&#xff09;&#xff09;的统一分析引擎。 Spark特点 快&#xff1a; Spark计算速度是MapReduce计算速度的10-100倍 易用&#xff1a;&#x…

大数据面试杀招——Spark高频考点,必知必会!

前面两篇文章分别为大家介绍了大数据面试杀招 关于Hive 与 Hadoop 的内容&#xff0c;收到读者朋友们一致的好评和赞赏。嘿嘿&#xff0c;本篇文章我们就继续来研究&#xff0c;关于Spark的面试热点&#xff0c;又有哪些~ 一、你是怎么理解Spark&#xff0c;它的特点是什么&…

Spark常见20个面试题(含大部分答案)

1、什么是宽依赖&#xff0c;什么是窄依赖&#xff1f;哪些算子是宽依赖&#xff0c;哪些是窄依赖&#xff1f; 窄依赖就是一个父RDD分区对应一个子RDD分区&#xff0c;如map&#xff0c;filter 或者多个父RDD分区对应一个子RDD分区&#xff0c;如co-partioned join 宽依赖是一…

MATLAB实现Lagrange插值函数

MATLAB实现Lagrange插值函数 首先我们绘制Lagrange基函数 首先给出一个Lagrange基函数比较复杂的设法&#xff1a; function ylagrange(x0,y0,x) nlength(x0);mlength(x); for i1:mzx(i);s0.0;for k1:np1.0;for j1:nif j~kp p*(z-x0(j))/(x0(k)-x0(j));endendsp*y0(k)s;endy…

MATLAB----数据插值

本篇参考于&#xff1a;中国大学慕课&#xff0c;专题五&#xff0c;“5.3数据插值” 1.一维数据插值interp1() 2.二维数据插值interp2() 1.一维数据插值 调用格式&#xff1a;interp1(X,Y,X1.method)。根据X&#xff0c;Y的值&#xff0c;计算函数在X1处的值。其中X,Y为已知…

matlab中的interp2插值函数

看了好多文章才大体明白插值的含义&#xff0c;(⊙﹏⊙)b&#xff0c;这理解能力也是醉了.....为了记住这个惨痛教训&#xff0c;在吃饭前要把看到的文章总结一下~~ interp2 功能 二维数据内插值 格式 (1)ZI interp2(X,Y,Z,XI,YI) 好多文章里巴拉巴拉说了一堆&#xff0c;迷迷…

matlab interp2插值函数的使用

参考&#xff1a; https://blog.csdn.net/hanchan94/article/details/53942998 https://blog.csdn.net/sgfmby1994/article/details/52598270 interp2 的作用 interp2函数也是用来进行插值操作的&#xff0c;举个例子来讲&#xff0c;假设我们有一个33的矩阵&#xff0c;但…

matlab interp插值函数

本文转载自&#xff1a;https://www.jianshu.com/p/7d5e061747ca 什么是插值函数咧&#xff0c;我所理解的插值函数就是&#xff0c;有一些点但是直接plot出来的图&#xff0c;不大好看&#xff0c;可能是锯齿的散点的&#xff0c;但是你想要一个平滑的曲线&#xff0c;而且去…

MATLAB中的一维插值与函数拟合

本文主要记录Matlab中常用的一维插值与函数拟合的使用方法 文章目录 前言一、一维插值二、函数拟合2.1 多项式拟合2.1.1多项式拟合指令2.1.2 图形窗口的多项式拟合 2.2 指定函数拟合 参考资料 前言 最近在学习数学建模&#xff0c;这部分关于怎么使用Matlab&#xff0c;刚好记…

理解Redis单线程快的原因

看过相关Redis基础的同学可以知道Redis是单线程的&#xff0c;很多面试题也很可能会问到“为什么Redis是单线程的还那么快”。 单线程的内部的原理。 本力求简单讲清每个知识点&#xff0c;希望大家看完能有所收获。 这里就简单回顾一下吧&#xff1a; I/O多路复用的特点是…

Redis总结(八)redis单线程还是多线程问题

redis为什么可以支持高并发和它内部的工作模式有不可分割的关系&#xff1a; 绝大部分请求是纯粹的内存操作&#xff08;非常快速&#xff09;采用单线程,避免了不必要的上下文切换和竞争条件非阻塞IO - IO多路复用 Redis客户端对服务端的每次调用都经历了发送命令&#xff0…