spark面试题总结(大数据面试)

本文详述了Spark与MapReduce的区别,强调Spark的内存计算模型和DAG执行的优势,深入剖析了Spark的RDD、DataFrame、Dataset、算子、DAG、checkpoint、广播变量和累加器等概念,解释了数据倾斜、内存管理和优化策略,以及从Kafka获取数据的方法。此外,还讨论了Spark运行模式、YARN集成和避免OOM的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spark概述

Spark是一种快速、通用、可扩展的大数据分析引擎。
Spark是基于内存计算的大数据并行计算框架。Spark基于内存计算,提高了在大数据环境下数据处理实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量廉价硬件之上,形成集群。

1、核心组件

SparkCore: 核心部分 包含Spark基本功能(任务调度 内存管理 容错机制等)

SparkSQL: Spark中交互式处理模块

SparkStreaming: Spark中流式数据处理的模块

SparkMLib:Spark机器学习相关模块 => Mahout

SparkGraphX: Spark中图形计算的模块

SparkManagers:集群管理 (HadoopYARN、ApacheMesos、Spark自带的单独调度器)

2、spark与mapreduce的比较

MR代码繁琐,只能支持map和reduce方法。执行效率低下
不适合迭代多次、交互式、流式的处理。
Spark计算的核心思路就是将数据集缓存在内存中加快读取速度,Spark的中间结果放到内存中,一次创建数据集,可以多次迭代运算,减少IO开销。适合运算比较多的ML和DL。
Hadoop MapReduce将每个计算任务都划分为Map、Shuffle和Reduce三个阶段,Map的输入和输出要读写磁盘,Reduce的输入和输出也要读写磁盘,这对于通过递归迭代算法来解决的问题,如机器学习和数据挖掘,无疑在性能上产生很大的影响。
Spark内存级计算模型
Spark的DAG(有向无环图作业),Spark实现了非常精致的作业调度系统,这是Spark的精髓所在

Spark在计算模型和调度上比MR做了更多的优化,不需要过多地和磁盘交互。

1、Spark计算比MapReduce快的根本原因在于DAG计算模型。DAG相比Hadoop的MapReduce在大多数情况下可以减少shuffle次数。spark遇到宽依赖才会出现shuffer,通常每次MapReduce都会有一次shuffer;DAG 相当于改进版的 MapReduce,可以说是由多个 MapReduce 组成,当数据处理流程中存在多个map和多个Reduce操作混合执行时,MapReduce只能提交多个Job执行,而Spark可以只提交一次application即可完成。

2、MapReduce 每次shuffle 操作后,必须写到磁盘,然后每次计算都需要从磁盘上读书数据,磁盘上的I/O开销比较大。spark的Executor中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备,当需要多轮迭代计算时,可以将中间结果存储到这个存储模块里,下次需要时,就可以直接读该存储模块里的数据,而不需要读写到HDFS等文件系统里,因而有效减少了IO开销;还有一点就是spark的RDD数据结构,RDD在每次transformation后并不立即执行,而且action后才执行,有进一步减少了I/O操作。

3、MR它必须等map输出的所有数据都写入本地磁盘文件以后,才能启动reduce操作,因为mr要实现默认的根据Key的排序!所以要排序肯定得写完所有数据,才能排序,然后reduce来拉取。但是spark不需要,spark默认情况下,是不会对数据进行排序的。因此shufflemaptask每写入一点数据,resulttask就可以拉取一点数据,然后在本地执行我们定义的聚合函数和算子,进行计算.

4、利用多线程来执行具体的任务(Hadoop MapReduce采用的是进程模型),减少任务的启动和切换开销;

3、spark的RDD与DataFrame以及Dataset的区别:

1、基本数据结构RDD:是弹性分布式数据集。

(1)RDD特点

1)弹性:RDD的每个分区在spark节点上存储时默认是放在内存中的,若内存存储不下,则存储在磁盘中。

2)分布性:每个RDD中的数据可以处在不同的分区中,而分区可以处在不同的节点中.

3)容错性:当一个RDD出现故障时,可以根据RDD之间的依赖关系来重新计算出发生故障的RDD.

(2)RDD与DataFrame以及DataSet的区别

1)RDD

a、具有面向对象的风格,是一组表示数据的Java或Scala对象,编译时类型安全,方便处理非结构化数据。

b、处理结构化数据比较麻烦;默认采用的是java序列号方式,序列化性能开销大,而且数据存储在java堆内存中,导致gc比较频繁

2)DataFrame:

a、是一个按指定列组织的分布式数据集合。类似于表。处理结构化数据方便;可以将数据序列化为二进制格式,数据保存在堆外内存中,可以减少了gc次数。

b、不支持编译时类型安全,若结构未知,则不能操作数据。不具有面向对象风格。

3)DataSet

a、表示行(row)的JVM对象或行对象集合形式的数据,在编译时检查类型安全。方便处理结构化和非结构化数据。采用堆外内存存储,gc友好

4、spark的算子

(1)transform算子:map转换算子,filter筛选算子,flatmap,groupByKey,reduceByKey,sortByKey,join,cogroup,combinerByKey。

(2)action算子:reduce,collect,count,take,aggregate,countByKey。

transformation是得到一个新的RDD,方式很多,比如从数据源生成一个新的RDD,从RDD生成一个新的RDD,action是得到一个值,或者一个结果(直接将RDDcache到内存中)所有的transformation都是采用的懒策略,就是如果只是将transformation提交是不会执行计算的,计算只有在action被提交的时候才被触发。

(3)map与mapPartitions的区别

1)map是对rdd中的每一个元素进行操作;mapPartitions则是对rdd中的每个分区的迭代器进行操作

2)假如是普通的map,若一个partition中有1万条数据。那么map中的方法要执行和计算1万次。若是MapPartitions,一个task仅仅会执行一次function,此function一次接收所有的partition数据,执行一次即可,性能比较高。SparkSql或DataFrame默认会对程序进行mapPartition的优化。

3)普通的map操作通常不会导致内存的OOM异常,因为可以将已经处理完的1千条数据从内存里面垃圾回收掉。 但是MapPartitions操作,对于大量数据来说,将一个partition的数据一次传入一个function以后,那么可能一下子内存不够,但是又没有办法去腾出内存空间来,可能就OOM,内存溢出。

(4)treeReduce与reduce的区别

1)treeReduce:是在reduce的时候,先在自己的本地节点分区进行本地聚合一下,然后在进行全局聚合,相当于预处理.

2)reduce:是在reduce的时候,没有本地聚合,直接返回给driver端。

(5)coalesce与repartition的区别

1)coalesce 与 repartition 都是对RDD进行重新划分,repartition只是coalesce接口中参数shuffle为true的实现。

2)若coalesce中shuffle为false时,传入的参数大于现有的分区数目,RD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值