大数据-Spark篇-面试题总结
题目来源 最全腾讯等BAT大数据面试99题 以下答案仅供参考,如有错误请指正
1. Spark的Shuffle原理及调优?
- 原理:
SparkShuffle过程与MapReduce类似;DAG阶段,以Shuffle为界分为map stage和reduce stage,map阶段进行任务计算后下发到各自partition中,同时写入磁盘,该过程为shuffle write;reduce阶段读取map计算后各分区的值进一步计算,该过程为shuffle read; - 调优:
- 尽量减少shuffle次数
- 必要时主动shuffle,通常用于改变并行度,提高后续分布式运行速度
- 合并Map端输出文件
开启相关设置:conf.set(“spark.shuffle.consolidateFiles”,” true”)
- 调节map端内存缓冲区大小和reduce端内存缓冲区内存占比
spark.shuffle.file.buffer
,默认32k
在map task处理的数据量比较大的情况下,而你的task的内存缓冲默认是比较小的,32kb。可能会造成多次的map端往磁盘文件的spill溢写操作,发生大量的磁盘IO,从而降低性能。
调优原则:
spark.shuffle.file.buffer
,每次扩大一倍,然后看看效果,64,128;spark.shuffle.memoryFraction
,0.2
reduce端聚合内存,占比。默认是0.2。如果数据量比较大,reduce task拉取过来的数据很多,那么就会频繁发生reduce端聚合内存不够用,频繁发生spill操作,溢写到磁盘上去。而且最要命的是,磁盘上溢写的数据量越大,后面在进行聚合操作的时候,很可能会多次读取磁盘中的数据,进行聚合。
调优原则:
spark.shuffle.memoryFraction
,每次提高0.1,看看效果。 - SortShuffle代替HashShuffle,避免创建多分磁盘文件(Spark2.0之后的版本官方仅保留了SortShuffle)
参考连接:Spark Shuffle原理及相关调优
2. hadoop和spark使用场景?
- Hadoop
离线大数据量批量计算,实时要求性低场景,大数据量存储,日志处理,个性化广告推荐 - Spark
内存分布式计算框架,伪实时计算,微批计算达到实时,产品实时推荐
3. spark如何保证宕机迅速恢复?
- 适当增加Spark的StandBy Master;
- 编写脚本定期给Master发心跳,若宕机则进行重启;
4. hadoop和spark的相同点和不同点?
Hadoop
Hadoop的MR为多进程模型,系统稳定性优于Spark,但MR只有Map和Reduce两个阶段,导致表达能力欠缺,操作仅能在这两个阶段完成;同时读写HDFS时会产生大量磁盘IO操作;Hadoop适合于大数据量批量的或者高延迟的离线数据计算;Spark
Spark为基于内存的多线程模型,系统稳定性略差,但是计算速度优于Hadoop,同时因为Spark基于内存进行计算,在不对系统进行调优的情况下很容易出现OOM等系统问题,导致任务结束无法继续;提供丰富的算子转换操作;使数据处理不单单拘泥于Map和Reduce,计算模型更加灵活;Spark适合低延迟内存密集型的数据计算;
5. RDD持久化原理?
通过调用cache()和persist()方法将计算后的数据持久化到内存中;
其中cache()的默认实现即为persist(MEMORY_ONLY);
persist()有可选项:
MEMORY_ONLY
:仅存于内存,无法存储的partition会被重新计算;MEMORY_AND_DISK
:存于内存和磁盘,无法存储的partition会被写入磁盘,需要时从磁盘读取MEMORY_ONLY_SER
:仅存于内存,但会序列化;序列化减少内存开销,但取用时反序列化会导致CPU占用过高MEMORY_AND_DISK_SER
:同MEMORY_AND_DISK
,但会被序列化DISK_ONLY
:仅存于磁盘;MEMORY_ONLY_2/MEMERY_AND_DISK_2
:尾部加2表示会进行备份,防止数据丢失
6. checkpoint检查点机制?
SparkStreaming中的容错保证机制,保证程序出错时,仍可以从检查点恢复,保证数据高可用,同时可以减少回溯时间尽快重新开始计算
7. checkpoint和持久化机制的区别?
持久化是将数据保存在磁盘中,RDD的lineage仍旧保持不变,但持久化更容易丢数据,节点故障会导致数据从磁盘和内存中消失;检查点机制会将数据保存到高可用的文件系统中,与此同时lineage发生改变,检查点之前的lineage消失,只有当前点的状态;
8. Spark Streaming和Storm有何区别?
- SparkStreaming 秒级实时计算;RDD 本质是小批量的计算达到实时;但也因此吞吐量高于Storm
- Storm 毫秒级实时计算;数据收到即处理;可以实时调整并行度;
所以:对实时性要求高或者数据量存在不稳定的情况下可选Storm,峰值动态调整并行度;对实时性要求一般可选SparkStreaming
9. RDD机制?
RDD弹性分布式数据集,一种数据结构,所有算子基于RDD执行;RDD具有很好的容错性,当节点错误partition数据丢失,可通过lineage的关系回溯重新计算partition的值;RDD的弹性体现在于RDD上自动进行内存和磁盘之间权衡和切换的机制。
10. Spark streaming以及基本工作原理?
SparkStreaming是一个秒级实时的,高吞吐量,利用多种算子和转换完成数据处理的流失批处理框架;
streaming接收数据后,将数据划分为一个个的batch交给spark引擎处理,处理后汇总成一个数据流,其中数据依然是一个个batch组成的;
11. DStream以及基本工作原理?
Dstream是一个抽象概念,代表一个持续不断的数据源,可由Kafka,flume等主动生成,也可由map,reduce等算子被动生成;
Dstream内部不断产生RDD,RDD为一个batch,每个RDD中包含一个时间段的数据;
12. spark有哪些组件?
Master管理集群;
worker计算节点;
Driver运行main函数;
Spark Context管理Spark生命周期,Client用户提交程序
13. spark工作机制?
用户Client端提交程序,Driver运行程序main方法,生成Spark Context上下文;生成dag图,根据rdd间依赖关系划分task,将task提交到executor中执行;
14. Spark工作的一个流程?
- 构建Spark Application的运行环境(启动SparkContext),SparkContext向资源管理器(可以是Standalone、Mesos或YARN)注册并申请运行Executor资源;
- 资源管理器分配Executor资源并启动Executor,Executor运行情况将随着心跳发送到资源管理器上;
- SparkContext构建成DAG图,将DAG图分解成Stage,并把Taskset发送给Task Scheduler。Executor向SparkContext申请Task,Task Scheduler将Task发放给Executor运行同时SparkContext将应用程序代码发放给Executor。
- Task在Executor上运行,运行完毕释放所有资源。
参考链接 Spark 工作流程图
15. spark核心编程原理?
- 定义初始RDD来源,可以为本地文件,HDFS或者输入流;
- 对RDD进行计算,通过算子转换等操作
- 循环往复程,第一个计算完了以后,数据可能就会到了新的一批节点上,也就是变成一个新的RDD。然后再次反复,针对新的RDD定义计算操作
- 获得最终数据保存数据
参考链接 Spark核心编程原理
16. spark基本工作原理?
首先在本地客户端(client)编写spark程序,然后将程序打成jar包,在某台能够连接到spark集群的机器上提交spark程序,spark程序会被提交到spark集群上运行。
17. spark性能优化有哪些?
分配更多资源;
调整并行度;
重构RDD架构以及RDD持久化;
广播大变量;
使用Kryo序列化;
使用fastutil优化数据格式;
调节数据本地化等待时长;
参考链接 Spark性能调优 密码:ibean.top,如果分享关闭请留言
18. updateStateByKey详解?
- 大数量updateBykey不适合,可以采用redis
- key超时,如何清空,来节约内存
由于已存在状态的key,无论是否在新批次里有数据,都会调用updateFunc。
返回None就可以清空超时key - 初始状态
对于状态的算子一定要开启checkpoint,实际就是指定checkpoint目录
checkpoint频率:5-10个滑动窗口
参考链接
sparkstreaming状态管理upstatebykey
sparkstreaming状态管理外部存储篇
19. 宽依赖和窄依赖?
- 窄依赖就是指父RDD的每个分区只被一个子RDD分区使用
- 宽依赖就是指父RDD的每个分区都有可能被多个子RDD分区使用
参考链接 Spark宽依赖与窄依赖
20. spark streaming中有状态转化操作?
有状态转化: 依赖之前的批次数据或者中间结果来计算当前批次的数据,包括updateStatebyKey()和window()
参考链接 SparkStreaming入门教程(四)有状态和无状态的转化操作
21. spark常用的计算框架?
Spark Core用于离线计算,Spark SQL用于交互式查询,Spark Streaming用于实时流式计算,Spark MLlib用于机器学习,Spark GraphX用于图计算。
Spark主要用于大数据的计算,而hadoop主要用于大数据的存储(比如hdfs、hive和hbase等),以及资源调度yarn。Spark+hadoop的组合是未来大数据领域的热门组合
22. spark整体架构?
23. Spark的特点是什么?
(1)速度快:Spark基于内存进行计算(当然也有部分计算基于磁盘,比如shuffle)。
(2)容易上手开发:Spark的基于RDD的计算模型,比Hadoop的基于Map-Reduce的计算模型要更加易于理解,更加易于上手开发,实现各种复杂功能,比如二次排序、topn等复杂操作时,更加便捷。
(3)超强的通用性:Spark提供了Spark RDD、Spark SQL、Spark Streaming、Spark MLlib、Spark GraphX等技术组件,可以一站式地完成大数据领域的离线批处理、交互式查询、流式计算、机器学习、图计算等常见的任务。
(4)集成Hadoop:Spark并不是要成为一个大数据领域的“独裁者”,一个人霸占大数据领域所有的“地盘”,而是与Hadoop进行了高度的集成,两者可以完美的配合使用。Hadoop的HDFS、Hive、HBase负责存储,YARN负责资源调度;Spark复杂大数据计算。实际上,Hadoop+Spark的组合,是一种“double win”的组合。
(5)极高的活跃度:Spark目前是Apache基金会的顶级项目,全世界有大量的优秀工程师是Spark的committer。并且世界上很多顶级的IT公司都在大规模地使用Spark。
24. 搭建spark集群步骤?
- 安装spark包
- 修改 spark-env. sh
- 修改slaves文件
- 分发spark包,安装spark集群
- 启动spark集群
- 查看集群状态,spark集群的默认web管理页面端口为8080,url为http://master:8080
25. Spark的三种提交模式是什么?
- Spark内核架构,即standalone模式,基于Spark自己的Master-Worker集群;
- 基于Yarn的yarn-cluster模式;
- 基于Yarn的yarn-client模式。
如果要切换到第二种和第三种模式,将之前提交spark应用程序的spark-submit脚本,加上–master参数,设置为yarn-cluster,或yarn-client即可。如果没设置就是standalone模式
26. spark内核架构原理?
27. Spark yarn-cluster架构?
Yarn-cluster用于生产环境,优点在于driver运行在NM,没有网卡流量激增的问题。缺点在于调试不方便,本地用spark-submit提交后,看不到log,只能通过yarm application-logs application_id这种命令来查看,很麻烦。
(1)将spark程序通过spark-submit命令提交,会发送请求到RM(相当于Master),请求启动AM;
(2)在yarn集群上,RM会分配一个container,在某个NM上启动AM;
(3)在NM上会启动AM(相当于Driver),AM会找RM请求container,启动executor;
(4)RM会分配一批container用于启动executor;
(5)AM会连接其他NM(相当于worker),来启动executor;
(6)executor启动后,会反向注册到AM。
参考链接 Spark on Yarn两种模式剖析
28. Spark yarn-client架构?
Yarn-client用于测试,因为driver运行在本地客户端,负责调度application,会与yarn集群产生大量的网络通信,从而导致网卡流量激增,可能会被公司的SA警告。好处在于,直接执行时本地可以看到所有的log,方便调试。
(1)将spark程序通过spark-submit命令提交,会发送请求到RM,请求启动AM;
(2)在yarn集群上,RM会分配一个container在某个NM上启动application;
(3)在NM上会启动application master,但是这里的AM其实只是一个ExecutorLauncher,功能很有限,只会去申请资源。AM会找RM申请container,启动executor;
(4)RM会分配一批container用于启动executor;
(5)AM会连接其他NM(相当于worker),用container的资源来启动executor;
(6)executor启动后,会反向注册到本地的Driver进程。通过本地的Driver去执行DAGsheduler和Taskscheduler等资源调度。
和Spark yarn-cluster的区别在于,cluster模式会在某一个NM上启动AM作为Driver。
参考链接 Spark on Yarn两种模式剖析
29. SparkContext初始化原理?
- TaskScheduler如何注册application,executor如何反向注册到TaskScheduler;
- DAGScheduler;
- SparkUI。
参考链接 sparkContext原理剖析
30. Spark主备切换机制原理剖析?
- spark master的主备切换可以基于两种机制,一种是基于文件系统的,一种是基于zookeeper的
- 基于文件系统的主备切换机制在active master挂掉之后,需要我们手动去切换到standby master;
- 而基于zookeeper的主备切换机制在active master挂掉之后,可以实现自动的切换到standby master。
- 这里要说的master主备切换机制就是,在在active master挂掉之后切换到standby master,master会做哪些操作。
参考链接
spark主备切换机制剖析、
spark的主备切换极致原理剖析
31. spark支持故障恢复的方式?
- 通过血缘关系lineage,当发生故障的时候通过血缘关系回溯,再执行一遍来一层一层恢复数据;
- 通过checkpoint()机制,将数据存储到持久化存储中来恢复数据。
32. 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进行处理,实时计算。
- MR:对于迭代式计算处理较差;
- Spark:Spark将中间数据存放在内存中,提高迭代式计算性能。
33. 数据倾斜的产生和解决办法?
参考链接 Spark性能调优 【六、数据倾斜解决方案】 密码:ibean.top,如果分享关闭请留言
34. spark 实现高可用性:High Availability?
- 基于文件系统的单点恢复(Single-Node Recovery with Local File System)
- 基于zookeeper的Standby Masters(Standby Masters with ZooKeeper)
参考链接 Spark:Master High Availability(HA)高可用配置的2种实现
35. spark实际工作中,是怎么来根据任务量,判定需要多少资源的?
36. spark中怎么解决内存泄漏问题?
- driver端
- 可以增大driver的内存参数:
spark.driver.memory
(default 1g) - DAGScheduler和Spark Context运行在Driver端,rdd的stage切分由driver完成;当程序算子过多可能会切分出大量stage,占用driver内存
- 可以增大driver的内存参数:
- map过程产生大量对象
- 单个map产生大量对象导致;
- 不增加内存的情况下,减少每个task的大小;可以在会产生大量对象的map操作之前调用repartition方法,分区成更小的块传入map
- 数据不平衡导致内存溢出,解决方案与2相似,采用repartition的方式;
- shuffle后内存溢出
参考链接 spark 如何防止内存溢出